vue2和vue3中的数据传递对比

428 阅读2分钟

什么是组件?

组件是一个可以复用的vue实例,可以实现局部代码的交互和复用的集合。

vue2中组件之间的数据传递?

Props(父→子)

父组件通过v-bind绑定需要传递的值,子组件在props中接收传递过来的值。

父组件中通过v-bind绑定传递的参数:

 <comSon :getName='name' />

子组件中通过props接收传递过来的值:

export default {
  props: {
    getName: {
      type: String,
      default: ''
    }
  }
}
自定义事件(子→父)

在子组件中通过this.$emit()方法定义一个自定义事件,在父组件中通过v-on监听传递过来的自定义事件。 子组件中自定义事件:

mounted () {
    this.$emit('setGift', this.gift)
  },

父组件中通过v-on监听自定义事件:

<comSon :getName='name' @setGift='thanks' />
bus总线传值:(子→子)

使用bus总线可以实现子组件和子组件之间的传递。

第一步:在main.js中添加一行代码

Vue.prototype.$bus = new Vue()

第二步:组件A中使用$emit()定义自定义事件

change () {
      this.$bus.$emit('busChangeVal', this.bussName)
    }

第三步:组件B中使用$on()接收传递的值

created () {
    this.$bus.$on('busChangeVal', (val) => {
      console.log(`监听到传递过来的值${val}`)
    })
  },

vue3中组件之间的数据传递?

Props(父→子)

在vue3中父传子同样适用props传递,但是传递对象时需要注意:直接无法修改响应式对象,直接修改后台会报错,可以通过toRefs转化成普通对象再去修改;

setup(props) {
    //   直接无法修改传递过来的响应式对象
    // const person1 = props;
    // person1.name = "李四"; // Set operation on key "name" failed: target is readonly.

    //通过toRefs转化成普通对象再进行修改
    const person1 = toRefs(props.person);
    person1.name = "李四";

    return {
      person1,
    };
  },
自定义事件(子→父)

vue3中的子传父也是通过自定义事件传递的。

//子组件
setup(props,context) {
      //自定义事件
    context.emit("toParent",'脑白金')
},

//父组件
<ComA  @toParent="getGift" />
 function getGift(val) {
      console.log(val); //脑白金
 }
兄弟组件传值

vue3中删除了全局事件总线,就是在vue2中用的eventBus,,在vue3中如果兄弟组件传值,可以通过vuex,或者使用vue官方提供的两个插件mitt 或 tiny-emitter。

传后辈(爷→孙)

在前辈组件中使用provide传递数据

setup() {
    const data = reactive({
      person: {
        name: "张三",
      },
    });
    //provide用于传递数据
    provide('provideName',data.person)
    return {
      data,
    };
  },

在晚辈组件中使用inject接收数据

setup() {
    const provideName = inject("provideName");
    return {
      provideName,
    };
  },