vue父子组件间如何通过事件进行通信

41 阅读1分钟

因为父子组件之间的单项数据流,子组件props:[]接收父组件的内容,能使用,但是不能更改,要更改的话,可以有2种办法:

1.子组件methods里面使用$emit(),然父组件更改父组件传过来的变量,子组件里面使用的父组件里面传过来的数据就可以改变

2.子组件自己定义一个变量来接收父组件的内容,然后子组件内部更改子组件定义的变量,相当于自己更改自己。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="https://unpkg.com/vue@next"></script>
  </head>
  <body>
    <div id="root"></div>
  </body>
  <script>
    // 根组件
    const app = Vue.createApp({
      // 定义传值的变量
      data() {
        return {
          content: 1,
        };
      },
      // 逻辑,子组件$emit()向组件提交addOne,父组件处理子组件需要父组件做的事
      methods: {
        // 这个num是子组件里面提交的$emit()里面的第二个参数
        handleAddOne(num) {
          this.content += num;
        },
      },
      // 模板
      template: `
        <h1 @click="handleAddOne"> <Son :content="content" />    </h1>
        `,
    });
    // 全局子组件
    app.component("Son", {
      // 接收传过来的并使用
      props: ["content"],
      // 变量,如果使用父组件传过来的值并且改变这个值
      // 用$emit告诉父组件,在父组件里面修改传过来的值

      // 逻辑
    //   点击了以后,用$emit告知父组件需要做的事,$emit("addone",2)
    // $emit()里面第一个参数是父组件要做的事,第二个参数可以在父组件里面使用,具体看父组件的逻辑
      methods: {
        handleClick() {
          this.$emit("addOne","2");
        },
      },
      // 模板
      template: `
<h1 @click="handleClick">{{content}}</h1>
`,
    });
    // 跟组件绑定到div里面
    const vm = app.mount("#root");
  </script>
</html>