vue3 setup (组合式 API) 父子传参,父孙传参。
- 通过 propsData传递
//父组件
<--html-->
<problem :resData="resData"></problem>
<--js-->
<script setup>
let resData = reactive({ arr: { name: '李四', age: 1 } });
//异步获取值
function getData(){
return new Promise((res,rej)=>{
.......
resData.arr = {
name: '张三',
age: 19
};
})
}
</script>
//子组件
<--html-->
<div>{{fpData }}</div>
<fxRadio :fpData="fpData"></fxRadio> //子组件中调用孙组件
<script setup>
const propsData = defineProps({
resData: {
type: Object,
default: {}
}
});
let fpData = ref({});
fpData.value = propsData.resData;
</script>
//孙组件
<--html-->
<div>{{sdata}}</div>
<script setup>
const propsData = defineProps({
fpData: {
type: Object,
default: {}
}
});
let sdata= ref({});
sdata.value = propsData.fpData;
</script>
总的来说,给孙组件传递的时候,和父传子的方式是一样的,照搬就行,另外vue3中已经不需要通过watch来监听传递的对象的改变了。
- 通过 provide传递
//父组件
<--js-->
<script setup>
import { reactive, provide} from 'vue'; //引入provide
let resData = reactive({ arr: { name: '李四', age: 1 } });
//异步获取值
function getData(){
return new Promise((res,rej)=>{
.......
resData.arr = {
name: '张三',
age: 19
};
})
}
getData();
provide('pData', resData); //可以不用等接口返回,先进行扩散。异步获得数据后会自动更新。
</script>
//子组件
<--html-->
<div>{{tdata }}</div>
<--js-->
<script setup>
import { inject, ref } from 'vue'; //引入inject
let tdata = ref({});
const pData = inject('pData');
tdata.value = pData;
watch(tdata.value, (newval) => {
console.log('改变了@@', newval);
//tdata.value = newval;
});
</script>
//孙组件 与 子组件写法一致