组件通信

父组件向子组件通信

子组件并不能获取父组件实例,当父组件向子组件通信时,应该使用属性来传递数据。

  1. var SubComponent = Intact.extend({
  2. template: '<div>{self.get("data")}</div>'
  3. });
  1. var SubComponent = self.SubComponent;
  2. <SubComponent data="hello" />
  1. Intact.extend({
  2. template: template,
  3. _init: function() {
  4. this.SubComponent = SubComponent;
  5. }
  6. });

动态prop

除了传递字面量数据,你还可以通过{}语法传递动态数据

  1. var SubComponent = self.SubComponent;
  2. <div>
  3. <input v-model="message" />
  4. <SubComponent data={self.get('message')} />
  5. </div>
  1. Intact.extend({
  2. template: template,
  3. defaults: function() {
  4. return {message: 'hello'};
  5. },
  6. _init: function() {
  7. this.SubComponent = SubComponent;
  8. }
  9. });

子组件向父组件通信

子组件向父组件通信,则是通过事件来传递数据。

以下例子仅仅为了演示如何通过自定义事件向父组件通信。大部分实际应用, 无需手动触发事件,使用默认事件即可达到目的。

  1. var SubComponent = Intact.extend({
  2. template: '<input \
  3. ev-input={self.changeValue} \
  4. value={self.get("value")}\
  5. />',
  6. changeValue: function(e) {
  7. var value = e.target.value;
  8. this.set('value', value);
  9. // 手动触发事件,传入数据value
  10. this.trigger('change', value);
  11. }
  12. });
  1. var SubComponent = self.SubComponent;
  2. <div>
  3. <SubComponent ev-change={self.set.bind(self, 'message')} />
  4. 接收到子组件的数据:{self.get('message')}
  5. </div>
  1. Intact.extend({
  2. template: template,
  3. _init: function() {
  4. this.SubComponent = SubComponent;
  5. }
  6. });

Intact组件的属性和事件是属于组件实例的,你不能将组件当做元素DOM使用, 例如:如果组件没有暴露click事件,你给它绑定click事件是无效的。

  1. // 以下click事件和class属性都无效,因为SubComponent并没有处理它们
  2. <SubComponent ev-click={function() {}} class="test" />

非父子组件通信

当两个非父子组件要进行通信时,需要借助它们共同的父组件来代理通信。

我们将上面定义的SubComponent下面定义的Component当做兄弟节点渲染,当它们需要通信时, 可以如下这么做:

  1. var Component = Intact.extend({
  2. template: '<div>来自SubComponent的数据:{self.get("data")}</div>'
  3. });
  1. var SubComponent = self.SubComponent;
  2. var Component = self.Component;
  3. <div>
  4. <SubComponent ev-change={self.set.bind(self, 'message')} />
  5. <Component data={self.get('message')} />
  6. </div>
  1. Intact.extend({
  2. template: template,
  3. _init: function() {
  4. this.SubComponent = SubComponent;
  5. this.Component = Component;
  6. }
  7. });