Vue--父子组件传值&祖孙组件传值&兄弟组件传值&全局状态管理

1.父子组件传值
父组件Animal
在父组件中,定义名称和年龄,导入子组件Bird,并绑定父组件的属性值,在子组件中,通过props来引用父组件属性的值,子组件向父组件传值,可以通过$emit触发自定义事件,将子组件中已经修改的值传给父组件,父组件定义子组件传来的方法来修改属性的值

<template>
  <div class="animal">
        <h2>动物</h2>
        <div>名称:{{name1}}</div>
        <div>年龄:{{age1}}</div>
        <!-- 向子组件传值,可以通过props -->
        <Bird :name="name1" :age="age1" @updateData="updateData"></Bird>
  </div>
</template>
<script>
import Bird from './Bird.vue'
export default {
  name: "Animal",
  data() {
      return {
          name1:'大雁',
          age1:20,
      }
  },
  components:{
      Bird
  },
  methods: {
      //该方法,修改name1和age1数据
      updateData(e){
         this.name1 = e.name
         this.age1 = e.age
      },  
  },
};

子组件

<template>
  <div class="bird">
    <h2>鸟类</h2>
    <div>名称:{{ myName }}</div>
    <div>年龄:{{ myAge }}</div>
    <button @click="updateData">修改信息</button>
  </div>
</template>
<script>
export default {
  name: "Bird",
  //注意:props里面的数据是不能修改的
  props: ["name", "age"],
  data() {
    return {
      myName: this.name,
      myAge: this.age,
    };
  },
  methods: {
    updateData() {
      this.myName = "仙鹤";
      this.myAge = 10;
      // 向父组件传值,可以通过$emit触发自定义事件
      this.$emit("updateData", { name: this.myName, age: this.myAge });
    },
  },
};
</script>

2.祖孙组件传值
例如父组件是Animal,子组件是Bird,孙组件是Dove,孙组件要从父组件中拿数据可使用依赖注入
父组件里使用provide,子组件里使用inject
父组件

<template>
  <div class="animal">
        <h2>动物</h2>
        <div>名称:{{name2}}</div>
        <div>年龄:{{age2}}</div>
        <hr>
        <Bird></Bird>
  </div>
</template>
<script>
import Bird from './Bird.vue'
export default {
  name: "Animal",
  data() {
      return {
          name2:'小明',
          age2:5
      }
  },
  // provide方法,返回的对象里面的数据是依赖数据
  provide(){
      return {
          boveName:this.name2,
          boveAge:this.age2,
          // 将修改name2和age2的方法,设置为依赖数据
          updateDove:this.updateDove
      }
  },
  components:{
      Bird
  },
  methods: {
      //该方法,修改name2和age2数据
      updateDove(bove){
          this.name2 = bove.name
          this.age2 = bove.age
      }
  },
};
</script>

子组件

<template>
  <div class="bird">
    <Dove />
  </div>
</template>
<script>
import Dove from "./Dove.vue";
export default {
  name: "Bird",
  components: {
    Dove,
  },
};

孙组件

<template>
  <div class="dove">
    <h2>鸽子</h2>
    <div>名称:{{ myBoveName }}</div>
    <div>年龄:{{ myBoveAge }}</div>
    <button @click="updateData">修改信息</button>
  </div>
</template>
<script>
export default {
  name: "Dove",
  inject: ["boveName", "boveAge", "updateDove"],
  data() {
    return {
      myBoveName: this.boveName,
      myBoveAge: this.boveAge,
    };
  },
  methods: {
    updateData() {
      this.myBoveName = "晓红";
      this.myBoveAge = 8;
      this.updateDove({ name: this.myBoveName, age: this.myBoveAge });
    },
  },
};
</script>

原理:当组件配置了provide时,它就会自动创建一个新的空对象保存配置的provide,同时这个新对象的原型指向父组件的provide。通过这种原型链机制,在孙组件就很容易访问到祖辈组件的provide
而inject会尝试寻找目标key,包括provides的原型链上,没有找到key的还就返回默认值
3.兄弟组件传值
例如Dove和Crow是Bird的子组件,可通过$bus来传值,然后在main.js中声明

// 在Vue的原型对象向上添加一个属性叫$bus,该属性是一个Vue实例对象
Vue.prototype.$bus = new Vue()

子组件1

<template>
  <div class="dove">
    <h2>鸽子</h2>
    <button @click="updateCrow">修改乌鸦信息</button>
  </div>
</template>
<script>
export default {
  name: "Dove",
  methods: {
    //修改乌鸦信息的方法
    updateCrow() {
      // 触发updateCrow事件
      this.$bus.$emit("updateCrow", { name: "小王", age: 30 });
    },
  },
};
</script>

子组件2

<template>
  <div class="crow">
    <h2>乌鸦</h2>
    <div>名称:{{ name }}</div>
    <div>年龄:{{ age }}</div>
  </div>
</template>
<script>
export default {
  name: "Crow",
  data() {
    return {
      name: "小刘",
      age: 20,
    };
  },
  mounted() {
    // 监听updateCrow事件,当前该事件触发时,会执行对应的回调函数
    this.$bus.$on("updateCrow", (e) => {
      this.name = e.name;
      this.age = e.age;
    });
  },
};
</script>

4.全局状态管理
1.安装

npm install store

2.导入并创建全局管理对象

//导入vue
import Vue from 'vue'
//导入vuex
import Vuex from 'vuex'
//使用vuex
Vue.use(Vuex)
//创建全局状态管理对象
export default new Vuex.Store({
  //定义全局状态(状态就是数据)
  state:{
    car:{
        name:'奔驰',
        price:'40W'
    }
  },
  //定义修改状态的方法
  mutations:{
    //该方法,修改汽车信息
    updateCar(state,val){
        state.car = val
    }
  }
})

3.在组件中使用

<div>汽车名称:{{ $store.state.car.name }}</div>
    <div>汽车价格:{{ $store.state.car.price }}</div>
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容