Vue组件间通信的方法有哪些

发布时间:2023-03-23 09:20:23 作者:iii
来源:亿速云 阅读:111

Vue组件间通信的方法有哪些

在Vue.js开发中,组件是构建应用的基本单元。随着应用的复杂度增加,组件之间的通信变得尤为重要。Vue提供了多种方式来实现组件间的通信,本文将详细介绍这些方法,并通过示例代码帮助读者更好地理解和应用。

1. Props 和 Events

1.1 Props

Props 是父组件向子组件传递数据的一种方式。子组件通过 props 选项声明它期望接收的数据,父组件则通过属性绑定的方式将数据传递给子组件。

示例代码:

<!-- ParentComponent.vue -->
<template>
  <div>
    <ChildComponent :message="parentMessage" />
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      parentMessage: 'Hello from Parent'
    };
  }
};
</script>

<!-- ChildComponent.vue -->
<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>

<script>
export default {
  props: {
    message: {
      type: String,
      required: true
    }
  }
};
</script>

1.2 Events

Events 是子组件向父组件传递数据的一种方式。子组件通过 $emit 方法触发一个自定义事件,父组件则通过监听这个事件来接收数据。

示例代码:

<!-- ParentComponent.vue -->
<template>
  <div>
    <ChildComponent @child-event="handleChildEvent" />
    <p>{{ childMessage }}</p>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      childMessage: ''
    };
  },
  methods: {
    handleChildEvent(message) {
      this.childMessage = message;
    }
  }
};
</script>

<!-- ChildComponent.vue -->
<template>
  <div>
    <button @click="sendMessage">Send Message</button>
  </div>
</template>

<script>
export default {
  methods: {
    sendMessage() {
      this.$emit('child-event', 'Hello from Child');
    }
  }
};
</script>

2. $refs$parent / $children

2.1 $refs

$refs 是 Vue 提供的一个属性,用于直接访问子组件或 DOM 元素。通过 ref 属性,可以在父组件中引用子组件或 DOM 元素,并直接调用其方法或访问其属性。

示例代码:

<!-- ParentComponent.vue -->
<template>
  <div>
    <ChildComponent ref="child" />
    <button @click="callChildMethod">Call Child Method</button>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  methods: {
    callChildMethod() {
      this.$refs.child.childMethod();
    }
  }
};
</script>

<!-- ChildComponent.vue -->
<template>
  <div>
    <p>Child Component</p>
  </div>
</template>

<script>
export default {
  methods: {
    childMethod() {
      alert('Child Method Called');
    }
  }
};
</script>

2.2 $parent$children

$parent$children 是 Vue 实例的属性,用于访问父组件或子组件。$parent 可以访问当前组件的父组件实例,而 $children 可以访问当前组件的子组件实例。

示例代码:

<!-- ParentComponent.vue -->
<template>
  <div>
    <ChildComponent />
    <button @click="callChildMethod">Call Child Method</button>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  methods: {
    callChildMethod() {
      this.$children[0].childMethod();
    }
  }
};
</script>

<!-- ChildComponent.vue -->
<template>
  <div>
    <p>Child Component</p>
  </div>
</template>

<script>
export default {
  methods: {
    childMethod() {
      alert('Child Method Called');
    }
  }
};
</script>

3. $attrs$listeners

3.1 $attrs

$attrs 是 Vue 提供的一个属性,用于访问父组件传递给子组件的非 props 属性。这些属性通常是没有在子组件的 props 中声明的属性。

示例代码:

<!-- ParentComponent.vue -->
<template>
  <div>
    <ChildComponent custom-attr="Custom Attribute" />
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  }
};
</script>

<!-- ChildComponent.vue -->
<template>
  <div>
    <p>{{ $attrs['custom-attr'] }}</p>
  </div>
</template>

<script>
export default {
  inheritAttrs: false
};
</script>

3.2 $listeners

$listeners 是 Vue 提供的一个属性,用于访问父组件传递给子组件的所有事件监听器。通过 $listeners,子组件可以将事件监听器传递给更深层次的子组件。

示例代码:

<!-- ParentComponent.vue -->
<template>
  <div>
    <ChildComponent @custom-event="handleCustomEvent" />
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  methods: {
    handleCustomEvent() {
      alert('Custom Event Triggered');
    }
  }
};
</script>

<!-- ChildComponent.vue -->
<template>
  <div>
    <GrandChildComponent v-on="$listeners" />
  </div>
</template>

<script>
import GrandChildComponent from './GrandChildComponent.vue';

export default {
  components: {
    GrandChildComponent
  }
};
</script>

<!-- GrandChildComponent.vue -->
<template>
  <div>
    <button @click="$emit('custom-event')">Trigger Event</button>
  </div>
</template>

<script>
export default {};
</script>

4. provideinject

provideinject 是 Vue 提供的一种高级组件通信方式,允许祖先组件向其所有子孙组件注入依赖,而不需要通过 props 逐层传递。

示例代码:

<!-- AncestorComponent.vue -->
<template>
  <div>
    <ParentComponent />
  </div>
</template>

<script>
import ParentComponent from './ParentComponent.vue';

export default {
  components: {
    ParentComponent
  },
  provide() {
    return {
      sharedData: 'Shared Data from Ancestor'
    };
  }
};
</script>

<!-- ParentComponent.vue -->
<template>
  <div>
    <ChildComponent />
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  }
};
</script>

<!-- ChildComponent.vue -->
<template>
  <div>
    <p>{{ sharedData }}</p>
  </div>
</template>

<script>
export default {
  inject: ['sharedData']
};
</script>

5. Vuex

Vuex 是 Vue.js 的官方状态管理库,适用于大型应用中的全局状态管理。通过 Vuex,可以在应用的任何组件中访问和修改共享状态。

示例代码:

// store.js
import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment(state) {
      state.count++;
    }
  },
  actions: {
    increment({ commit }) {
      commit('increment');
    }
  }
});
<!-- ParentComponent.vue -->
<template>
  <div>
    <ChildComponent />
    <p>{{ count }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  computed: {
    count() {
      return this.$store.state.count;
    }
  },
  methods: {
    increment() {
      this.$store.dispatch('increment');
    }
  }
};
</script>

<!-- ChildComponent.vue -->
<template>
  <div>
    <p>{{ count }}</p>
  </div>
</template>

<script>
export default {
  computed: {
    count() {
      return this.$store.state.count;
    }
  }
};
</script>

6. Event Bus

Event Bus 是一种通过 Vue 实例作为事件中心来实现组件间通信的方式。通过 Event Bus,可以在任何组件中触发和监听事件。

示例代码:

// eventBus.js
import Vue from 'vue';
export const EventBus = new Vue();
<!-- ComponentA.vue -->
<template>
  <div>
    <button @click="sendMessage">Send Message</button>
  </div>
</template>

<script>
import { EventBus } from './eventBus.js';

export default {
  methods: {
    sendMessage() {
      EventBus.$emit('message', 'Hello from Component A');
    }
  }
};
</script>

<!-- ComponentB.vue -->
<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>

<script>
import { EventBus } from './eventBus.js';

export default {
  data() {
    return {
      message: ''
    };
  },
  created() {
    EventBus.$on('message', (message) => {
      this.message = message;
    });
  }
};
</script>

7. $root

$root 是 Vue 实例的属性,用于访问根实例。通过 $root,可以在任何组件中访问根实例的数据和方法。

示例代码:

<!-- App.vue -->
<template>
  <div>
    <ChildComponent />
    <p>{{ rootMessage }}</p>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      rootMessage: 'Hello from Root'
    };
  }
};
</script>

<!-- ChildComponent.vue -->
<template>
  <div>
    <button @click="showRootMessage">Show Root Message</button>
  </div>
</template>

<script>
export default {
  methods: {
    showRootMessage() {
      alert(this.$root.rootMessage);
    }
  }
};
</script>

8. $emit$on

$emit$on 是 Vue 实例的方法,用于触发和监听自定义事件。通过 $emit$on,可以在组件之间进行事件通信。

示例代码:

<!-- ParentComponent.vue -->
<template>
  <div>
    <ChildComponent />
    <p>{{ message }}</p>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      message: ''
    };
  },
  created() {
    this.$on('child-event', (message) => {
      this.message = message;
    });
  }
};
</script>

<!-- ChildComponent.vue -->
<template>
  <div>
    <button @click="sendMessage">Send Message</button>
  </div>
</template>

<script>
export default {
  methods: {
    sendMessage() {
      this.$emit('child-event', 'Hello from Child');
    }
  }
};
</script>

9. v-model.sync

9.1 v-model

v-model 是 Vue 提供的一种语法糖,用于在表单元素和组件上实现双向数据绑定。通过 v-model,可以在父组件和子组件之间实现双向数据绑定。

示例代码:

<!-- ParentComponent.vue -->
<template>
  <div>
    <ChildComponent v-model="message" />
    <p>{{ message }}</p>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      message: ''
    };
  }
};
</script>

<!-- ChildComponent.vue -->
<template>
  <div>
    <input :value="value" @input="$emit('input', $event.target.value)" />
  </div>
</template>

<script>
export default {
  props: {
    value: {
      type: String,
      required: true
    }
  }
};
</script>

9.2 .sync

.sync 是 Vue 提供的一种修饰符,用于实现父子组件之间的双向数据绑定。通过 .sync,可以在父组件和子组件之间实现双向数据绑定。

示例代码:

<!-- ParentComponent.vue -->
<template>
  <div>
    <ChildComponent :message.sync="message" />
    <p>{{ message }}</p>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      message: ''
    };
  }
};
</script>

<!-- ChildComponent.vue -->
<template>
  <div>
    <input :value="message" @input="$emit('update:message', $event.target.value)" />
  </div>
</template>

<script>
export default {
  props: {
    message: {
      type: String,
      required: true
    }
  }
};
</script>

10. $broadcast$dispatch

$broadcast$dispatch 是 Vue 1.x 中的方法,用于在组件树中向下或向上广播事件。在 Vue 2.x 中,这两个方法已被移除,但可以通过自定义事件或 Event Bus 实现类似的功能。

示例代码:

// eventBus.js
import Vue from 'vue';
export const EventBus = new Vue();
<!-- ParentComponent.vue -->
<template>
  <div>
    <ChildComponent />
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';
import { EventBus } from './eventBus.js';

export default {
  components: {
    ChildComponent
  },
  created() {
    EventBus.$on('broadcast-event', (message) => {
      alert(message);
    });
  }
};
</script>

<!-- ChildComponent.vue -->
<template>
  <div>
    <button @click="broadcastMessage">Broadcast Message</button>
  </div>
</template>

<script>
import { EventBus } from './eventBus.js';

export default {
  methods: {
    broadcastMessage() {
      EventBus.$emit('broadcast-event', 'Hello from Child');
    }
  }
};
</script>

11. $watch

$watch 是 Vue 实例的方法,用于监听数据的变化。通过 $watch,可以在数据变化时执行自定义逻辑。

示例代码:

<!-- ParentComponent.vue -->
<template>
  <div>
    <ChildComponent :message="message" />
    <button @click="changeMessage">Change Message</button>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      message: 'Hello'
    };
  },
  methods: {
    changeMessage() {
      this.message = 'Hello World';
    }
  }
};
</script>

<!-- ChildComponent.vue -->
<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>

<script>
export default {
  props: {
    message: {
      type: String,
      required: true
    }
  },
  watch: {
    message(newVal, oldVal) {
      alert(`Message changed from ${oldVal} to ${newVal}`);
    }
  }
};
</script>

12. $nextTick

$nextTick 是 Vue 实例的方法,用于在 DOM 更新后执行回调函数。通过 $nextTick,可以在 DOM 更新后执行自定义逻辑。

示例代码:

<!-- ParentComponent.vue -->
<template>
  <div>
    <ChildComponent ref="child" />
    <button @click="updateChild">Update Child</button>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  methods: {
    updateChild() {
      this.$refs.child.message = 'Updated Message';
      this.$nextTick(() => {
        alert('Child Component Updated');
      });
    }
  }
};
</script>

<!-- ChildComponent.vue -->
<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: 'Hello'
    };
  }
};
</script>

13. $forceUpdate

$forceUpdate 是 Vue 实例的方法,用于强制重新渲染组件。通过 $forceUpdate,可以在某些情况下强制更新组件的视图。

示例代码:

<!-- ParentComponent.vue -->
<template>
  <div>
    <ChildComponent ref="child" />
    <button @click="forceUpdateChild">Force Update Child</button>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  methods: {
    forceUpdateChild() {
      this.$refs.child.$forceUpdate();
    }
  }
};
</script>

<!-- ChildComponent.vue -->
<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: 'Hello'
    };
  }
};
</script>

14. $set

$set 是 Vue 实例的方法,用于向响应式对象添加新属性。通过 $set,可以确保新属性是响应式的。

示例代码:

”`

推荐阅读:
  1. Vue组件间的通信--父传子
  2. vue中实现组件间通信的方式有哪些

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

vue

上一篇:php如何去掉编辑器中的样式

下一篇:WordPress后台怎么删除不需要的侧边栏菜单

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》