provide多级组件传值

一、认识

常用于多层嵌套的组件的传值,provide/inject(提供/注入)。

二、用法

1.引入
import {provide,inject} from “vue”
我们即可用使用reactive或ref传递,也可以直接传递值或对象。其实传各种类型的数据都差不多。
1.传值

父组件:provide("scale", scale)  孙组件:let propScale = inject("scale")

2.传递一个对象
父组件:

const info={name:"dmc,age:20}
provide("info",info)

孙组件:

let info= inject("info")

3.传递一个数组
父组件:

provide(
  "deviceList",
  computed(() => {
    return deviceList.value;
  })
);

孙组件:

const deviceList: Ref<Device[]> = ref(inject("deviceList"));

4.孙组件触发事件改变值。
父组件:

<div>{{info.age}}</div>
const info=reactive({name:"dmc,age:20})
provide("info",info)

孙组件:

<button @click="changeAge">点击修改</button>
const changeAge = () => {
    info.age++
}

5.孙组件不允许修改父组件的值时。

provide("info",readonly(info))

6.孙组件触发事件改变父组件的值
如果我们确实希望改变父组件的数据,此时我们可以在父组件中设置方法,通过provide将该方法传递给子组件,保证数据是数据提供的位置进行修改。
父组件:

const changeAge = () => {
    info.age++
}
provide("changeAge",changeAge);

孙组件:

const changeAge= inject("changeAge")

三、经典案例

当父组件的某个值发生改变的时候,子组件的值也要跟着变。
我这里事画布的缩放比例默认值为0.3,点击加事件加0.1,画布大小变了,那画布上面的图形也要对应比例变化。

父组件:

const scale = ref(0.3);
provide("scale", scale);
//画布缩放
function handleCanvasZoom(type) {
  let w = Number(width.value.slice(0, -2));
  let h = Number(height.value.slice(0, -2));
  if (type === "add") {
    width.value = w + w * 0.05 + "px";
    height.value = h + h * 0.05 + "px";
    scale.value = scale.value + 0.05;
  } else {
    width.value = w - w * 0.05 + "px";
    height.value = h - h * 0.05 + "px";
    scale.value = scale.value - 0.05;
  }
}

孙组件:

const data= reactive({
    propScale: 0.3
})
const { propScale } = toRefs(data);
data.propScale = inject("scale");
watch(propScale, (newVal) => {
  let total = Number(((50 * 10) / 3).toFixed());
  data.shapeConfig.radiusX = total * newVal;
  data.shapeConfig.radiusY = total * newVal;
});

四、总结

此方法比较大型的项目中常用,我上面有总结不到位的请各位留言指教!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值