VueJS - 父子组件传值__前端__Vue.js
发布于 3 年前 作者 banyungong 1143 次浏览 来自 分享
粉丝福利 : 关注VUE中文社区公众号,回复视频领取粉丝福利

文档在不断更新中,用于记录工作中常用的父子组件传值方法,如果小伙伴们有其他方法,请评论告知,共同进步,🙏🙏

一、父组件向子组件传值

1.通过 v-bind:xxx 进行传递

<!-- 父组件 -->
<div id="app">
    父组件向子组件传值,
    <child :msg="msg1" />
    
    <child v-bind:msg="msg2" />
</div>

<script>
export default {
  data() {
    return {
      msg1: '我是子组件1',
      msg2: '我是子组件2',
    };
  },
};
</script>

2.在子组件,通过 this.$parent 获取父组件this对象

<!-- 子组件 -->
<div>
    <div>子组件:{{ msg }}</div>
</div>

<script>
export default {
  data() {
    return {
      msg: this.$parent.msg1,
    };
  },
};
</script>

3.在父组件使用 provide 和 inject

provide 和 inject 配套使用,参数说明如下:

  • provide: Object | () => Object
  • inject: Array<String> | {[key: String]: String | Symbol | Object}
// 父组件
export default {
  components: {
    child,
  },
  provide() {
    return {
      message: this.msg1,
    };
  },
  // 或
  // provide: {
  //   message: '我是子组件',
  // },
  data() {
    return {
      msg1: "我是子组件",
    };
  },
};
<!-- 子组件 -->
<template>
    <div>子组件:{{ message }}</div>
</template>

<script>
export default {
  // 数组
  inject: ["message"],

  // 对象
  // inject: {
  //   txt: "message",
  // },

  // 设置默认值
  // inject: {
  //   message: { default: "default value" },
  // },

  // 默认值-函数
  // inject: {
  //   message: {
  //     default: () => {
  //       return [1, 2, 3];
  //     },
  //   },
  // },

  // 完整带默认值
  // inject: {
  //   txt: {
  //     from: "message", // provide中指向的key
  //     default: "default value",
  //   },
  // },
};
</script>

二、子组件向父组件传值

1.子组件通过 $emit 传值

<!-- 父组件 -->
<template>
  <div id="app">
    <child @change="change" />
  </div>
</template>

<script>
export default {
  // ...
  methods: {
    change(val) {
      console.log(val); // 我是子组件向父组件传值
    },
  },
};
</script>

<!-- 子组件 -->
<template>
  <div></div>
</template>

<script>
export default {
  created() {
    this.$emit("change", "我是子组件向父组件传值");
  },
};
</script>

2.在父组件通过 $refs 获取子组件dom对象

<!-- 父组件 -->
<template>
  <div id="app">
    <child ref="child" />
  </div>
</template>

<script>
export default {
  // ...
  created() {
    this.$nextTick(() => {
      // 通过 $refs 获取子组件dom对象必须在dom渲染完成之后,或在 mounted 调用
      console.log(this.$refs.child.msg); // 我是子组件
    });
  }
};
</script>


<!-- 子组件 -->
<template>
  <div></div>
</template>

<script>
export default {
  data() {
    return {
      msg: '我是子组件'
    }
  }
};
</script>

版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 作者: 我若亦如风 原文链接:https://juejin.im/post/6997374228555104293

回到顶部