一、父组件向子组件传递数据

在 Vue 中,可以使用 props 向子组件传递数据。

子组件部分:

  1. <template>
  2. <header class="header">
  3. <div id="logo">{{logo}}</div>
  4. <ul class="nav">
  5. <li v-for="nav in navs">{{nav.li}}</li>
  6. </ul>
  7. </header>
  8. </template>

这是 header.vue 的 HTML 部分,logo 是在 data 中定义的变量。
如果需要从父组件获取 logo 的值,就需要使用 props: [‘logo’]

  1. <script>
  2. export default {
  3. name: "headerDiv",
  4. data () {
  5. return {
  6. navs: [
  7. {li: "主页"},
  8. {li: "日志"},
  9. {li: "说说"},
  10. {li: "主页"},
  11. {li: "相册"},
  12. }
  13. },
  14. props: ["logo"]
  15. }
  16. </script>

在 props 中添加了元素之后,就不需要在 data 中再添加变量了

父组件部分:

  1. <template>
  2. <div id="app">
  3. <HeaderDiv :logo="logoMsg"></HeaderDiv>
  4. </div>
  5. </template>

在调用组件的时候,使用 v-bind 将 logo 的值绑定为 App.vue 中定义的变量 logoMsg

  1. <script>
  2. import HeaderDiv from "./components/header";
  3. export default {
  4. name: "app",
  5. data () {
  6. retrn {
  7. logoMsg: "WiseWrong" // 将logo的值绑定为App.vue中定义的变量logoMsg
  8. }
  9. },
  10. components: {
  11. HeaderDiv
  12. }
  13. }
  14. </script>


然后就能将App.vue中 logoMsg 的值传给 header.vue 了:
VUE 组件传参 - 图1

二、子组件向父组件传递数据

子组件主要通过事件传递数据给父组件

子组件部分(回调函数向父组件传递数据):

  1. <template>
  2. <div class="login">
  3. <label>
  4. <span>用户名:</span>
  5. <input v-model="username" @change="setUser" />
  6. </label>
  7. </div>
  8. </template>

这是 login.vue 的 HTML 部分,当的值发生变化的时候,将 username 传递给 App.vue
首先声明一个了方法 setUser,用 change 事件来调用 setUser

  1. <script>
  2. export default {
  3. name: "login",
  4. data () {
  5. retrn {
  6. username: ""
  7. }
  8. },
  9. methods: {
  10. setUser: function () { // change事件来调用setUser
  11. this.$emit("transferUser", this.username);
  12. }
  13. }
  14. }
  15. </script>

在 setUser 中,使用了 $emit 来遍历 transferUser 事件,并返回 this.username
其中 transferUser 是一个自定义的事件,功能类似于一个中转,this.username 将通过这个事件传递给父组件

父组件部分(自定义事件来接收):

  1. <template>
  2. <div id="app">
  3. <LoginDiv @transferUser="getUser"></LoginDiv>
  4. <p>用户名为:{{user}}</p>
  5. </div>
  6. </template>

在父组件 App.vue 中,声明了一个方法 getUser,用 transferUser 事件调用 getUser 方法,获取到从子组件传递过来的参数 username

  1. <script>
  2. import LoginDiv from "./components/login";
  3. export default {
  4. name: "app",
  5. data () {
  6. retrn {
  7. user: ""
  8. }
  9. },
  10. methods: {
  11. getUser (msg) { // 用transferUser事件调用getUser方法,获取到从子组件传递过来的参数username
  12. this.user = msg;
  13. }
  14. }
  15. }
  16. </script>

getUser 方法中的参数 msg 就是从子组件传递过来的参数 username
VUE 组件传参 - 图2

三、子组件向子组件传递数据

使用 vue-bus 插件

安装

  1. npm install vue-bus

如果在一个模块化工程中使用它,必须要通过 Vue.use() 明确地安装 vue-bus:

  1. import Vue from 'vue';
  2. import VueBus from 'vue-bus';
  3. Vue.use(VueBus);

使用

监听事件

  1. // header组件
  2. <template>
  3. <div>
  4. <div>{{ addTodo }},你好世界</div>
  5. </div>
  6. </template>
  7. <script>
  8. data () {
  9. return {
  10. addTodo:""
  11. }
  12. },
  13. created() {
  14. this.$bus.on('add-todo', (val) => {
  15. this.addTodo = val
  16. });
  17. },
  18. </script>

触发事件

  1. // footer组件
  2. <template>
  3. <div>
  4. <div @click=“send”></div>
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. name: 'HelloWorld',
  10. data () {
  11. return {
  12. userName:null,
  13. newTodoText:''
  14. }
  15. },
  16. methods: {
  17. send () {
  18. this.newTodoText = 'hello world'
  19. this.$bus.emit('add-todo', this.newTodoText );
  20. },
  21. }
  22. }
  23. </script>

使用 vuex

安装

  1. npm install vuex

使用

  1. main.js添加:
    1. import Vuex from 'vuex'
    2. Vue.use( Vuex );
    3. const store = new Vuex.Store({
    4. //待添加
    5. })
    6. new Vue({
    7. el: '#app',
    8. store,
    9. render: h => h(App) /^[a-z]/
    10. })