vue 组件通信

70 阅读1分钟

组件通信就是传值。

父子组件

子拿到了父的数据。

实现方式(一)

父组件引入子组件,绑定数据;子组件用props接收,但是子组件不能直接修改父组件的数据。此种方法无法做到直接传到孙组件,需要逐层传递。

// 用`cva`搭建项目
yarn global add create-vite-app  //安装vite
cva <your-project-name>  //创建项目,cva是缩写
cd <your-project-name>
yarn   //安装依赖,相当于 yarn install
yarn dev  
// App.vue 父组件
<template>
  <div class="home">
    <h1>这是Home</h1>
    <hr />
    <!--父组件引入子组件,绑定数据--> 
    <List :str1="str1"></List>
  </div>
</template>
  
<script>
import List from "./components/List.vue";
export default {
  name: "App",
  data() {
    return {
      str1: "这是home的数据",
    };
  },
  components: { List },
};
</script>
// List.vue 子组件
<template>
  <div>
    <h2>这是List组件{{ str1 }}</h2>
  </div>
</template>

<script>
export default {
  // 子组件通过 props 接收
  props: {
    str1: {
      type: String,
      default: "",
    },
  },
};
</script>
image.png

实现方式(二)

子组件用$parent直接使用父组件数据。子组件还可以直接修改父组件的数据。

// List.vue 子组件
<template>
  <div>
    <h2>这是List组件{{ $parent.str1 }}</h2>
    <hr />
    <News :str1="str1"></News>
  </div>
</template>

依赖注入

// App.vue 父组件

provide() {
  return {
    val1: "这是home的依赖内容",
  };
},
// News.vue 后代组件

<h3>这是News组件{{ val1 }}</h3>

export default {
  inject: ['val1'],
};

后代传父

子传父

在子组件中定义自定义事件 $emit

// List.vue 子组件
<template>
  <div>
    <h2>这是List组件</h2>
    <button @click="btn">按钮</button>
    <hr />
  </div>
</template>

<script>
export default {
  data() {
    return {
      str2: "这是List组件的数据",
    };
  },
  methods: {
    btn() {
      this.$emit("change", this.str2);
    },
  },
};
</script>
// App.vue 父组件
<template>
  <div class="home">
    <h1>这是Home{{ str2 }}</h1>
    <hr />
    <List @change="homeBtn"></List>
  </div>
</template>
  
<script>
import List from "./components/List.vue";
export default {
  name: "App",
  data() {
    return {
      str2: "",
    };
  },
  components: {List},
  methods: {
    homeBtn(val) {
      this.str2 = val;
    },
  },
};
</script>
image.png

兄弟组件通信

eventBus