vue3.0 带响应式的 provide与inject用法

provide与inject主要用于从父组件向子组件传递数据。

在2.0我们通常用props接收来自父组件的参数,但是一个要从父子组件传递到孙子组件,这种情况就得从父组件到子组件,再从子组件传到孙子组件一级一级传递下去;引入 provide与inject就不需要一级一级向下传递。而是只需从父组件provide出去,再在需要用的组件里面inject即可。如图

论组件层次结构有多深,父组件都可以作为其所有子组件的依赖提供者。这个特性有两个部分:父组件有一个 provide 选项来提供数据,子组件有一个 inject 选项来开始使用这些数据。

官网:Provide / Inject | Vue.js

上用法:

父组件:

<template>
<div>
    <div   @click="changeVlaue()"> 点击改变</div>
    
</div>
</template>
import {
  reactive,
  provide,
  ref
} from 'vue'
 setup() {
    const type= ref("business"); //加上响应式,加上后父组件改变此值所有子组件的值都会跟着变
    //const type= "business"; //不加响应式,父组件调用了changeVlaue改变值后,子组件不会跟着一起改变
    //const type= reactive({type:"business"}); //另一种响应式,用哪种都行,只是取值的方式不一样
    provide('AssetsType', type)
    const methods = {
     changeVlaue: () => {
        type.value='我改变了'
      },
    }
    return {
      ...toRefs(methods),
      type
    }

}

子组件:

<template>
<div>
    <div> {{AssetsType}}</div>
    <div> {{test}}</div>
</div>
</template>
import {
  reactive,
  inject,
} from 'vue'

setup() {
    //用法一
     const test = inject('AssetsType')
    //用法二
    const state: any = reactive({
      AssetsType:inject('AssetsType')
    })
return {
      ...toRefs(state),
      test
    }

}

记录用法:详细看官网

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue 3.0 的响应原理与 Vue 2.x 相比有所改变,主要体现在两个方面:Proxy 替代 Object.defineProperty 和 取消了异步更新。 首先,Vue 3.0 使用了ES6 中的Proxy对象替换了 Object.defineProperty 实现响应,Proxy 对象可以代理任何类型的 JavaScript 对象,因此能够处理动态添加的属性,而 Object.defineProperty 只能劫持对象的属性访问和赋值。 其次,Vue 3.0 取消了 Vue 2.x 的异步更新机制。在 Vue 2.x 中,当数据发生改变时,Vue 会异步更新视图,将同步任务放在微任务队列中,在下一个事件循环周期中,再根据优先级执行这些任务。在 Vue 3.0 中,由于使用了 Proxy 所以对数据的改变的操作可以直接同步执行,因而取消了异步更新,这将提高应用的渲染性能。 在 Vue 3.0 中,当数据改变时,Vue 会遍历数据对象,在访问到对象属性时,通过 Proxy 拦截器劫持了它的 getter,当数据被访问时,记录用户当前的组件 target 并把组件实例添加到属性的订阅列表中,在 setter 中,把属性值重新赋值后,通知所有订阅该属性的组件更新视图。 需要注意的是,由于 Proxy 无法监听到数组的变化,因此 Vue 3.0 使用了重写数组方法的方来实现对数组的响应处理。具体实现也是通过在数组访问时劫持对应的方法,并且在数组改变时,通知所有依赖该数组的组件更新。 总之,Vue 3.0 的响应原理在性能和功能上都相对于 Vue 2.x 有所提升,同时在使用中也需要注意其对数组的响应实现方

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值