title:
categories:

- practice

组件的创建中,可能需要在运行时,通过状态树渲染出一个动态组件树。通常的方法,我们通过 dispatch/message 但是由于父组件及子组件都是单独动态创建的,因此父子组件之间实际上是没有父子关系的,因此需要将子组件的parentComponent指向父组件,以实现动态父子组件之间的消息传递。

example

此处给一个简单的例子,我们需要根据一个简单的状态树实现一个相应的组件样式,并实现父子组件的通信:

  1. const Child = san.defineComponent({
  2. template: `
  3. <div class="child">
  4. {{name}}<button on-click="sendMsg">send msg</button>
  5. </div>
  6. `,
  7. sendMsg() {
  8. this.dispatch('child-msg', this.data.get('msg'));
  9. }
  10. });
  11. const Parent = san.defineComponent({
  12. template: `
  13. <div class="parent" style="border: 1px solid red">
  14. I am parent
  15. <button on-click="addChild">
  16. add child
  17. </button>
  18. {{childMsg}}
  19. </div>`,
  20. addChild() {
  21. const childs = this.data.get('childs');
  22. const parentEl = this.el;
  23. childs.forEach(child => {
  24. let childIns = new Child({
  25. parent: this,
  26. data: child
  27. });
  28. childIns.attach(parentEl);
  29. this.childs.push(childIns);
  30. });
  31. },
  32. messages: {
  33. 'child-msg': function(arg) {
  34. this.data.set('childMsg', arg.value);
  35. }
  36. }
  37. });
  38. const parent = new Parent({
  39. data: {
  40. childs: [{
  41. name: 'I am child1',
  42. msg: 'child1 send msg'
  43. }, {
  44. name: 'I am child2',
  45. msg: 'child2 send msg'
  46. }]
  47. }
  48. });
  49. parent.attach(document.body);

实例

See the Pen QMMZPV by zhanfang (@zhanfang) on CodePen.