parent
44e44c3f80
commit
aab48951d0
3 changed files with 67 additions and 33 deletions
@ -1,44 +1,31 @@ |
|||||||
<template> |
<template> |
||||||
<input type="text" v-model="keyWord"> |
<div class="app"> |
||||||
<h3>{{keyWord}}</h3> |
<h3>我是app组件(祖){{name}}-{{price}}</h3> |
||||||
|
<child/> |
||||||
|
</div> |
||||||
</template> |
</template> |
||||||
|
|
||||||
<script> |
<script> |
||||||
import {ref, customRef} from "vue"; |
import child from "@/components/Child.vue"; |
||||||
|
import {reactive, toRefs, provide} from "vue"; |
||||||
|
|
||||||
export default { |
export default { |
||||||
name: 'App', |
name: 'App', |
||||||
|
components:{child}, |
||||||
setup() { |
setup() { |
||||||
// 自定义ref |
let car = reactive({ |
||||||
function myRef(value) { |
name:'奔驰', |
||||||
let timer |
price: '40W' |
||||||
// console.log('---myRef---', value) |
}) |
||||||
return customRef((track,trigger)=>{ |
provide('car', car) //给自己的后代组件传递数据 |
||||||
return { |
return {...toRefs(car)} |
||||||
get() { |
|
||||||
console.log(`有人从myRef这个容器中读取数据了,我把${value}给他了`) |
|
||||||
track() // 通知vue追踪数据变化 |
|
||||||
return value |
|
||||||
}, |
|
||||||
set(newValue) { |
|
||||||
console.log(`有人从myRef这个容器中数据改为了:${newValue}`) |
|
||||||
clearTimeout(timer) |
|
||||||
timer = setTimeout(()=>{ |
|
||||||
value = newValue |
|
||||||
trigger() //通知vue去重新解析模板 |
|
||||||
}, 500) |
|
||||||
} |
|
||||||
} |
|
||||||
}) |
|
||||||
} |
|
||||||
|
|
||||||
// let keyWord = ref('hello') // 使用默认的ref |
|
||||||
let keyWord = myRef('hello') |
|
||||||
|
|
||||||
return { |
|
||||||
keyWord, |
|
||||||
} |
|
||||||
} |
} |
||||||
|
|
||||||
} |
} |
||||||
</script> |
</script> |
||||||
|
|
||||||
|
<style> |
||||||
|
.app{ |
||||||
|
background-color: gray; |
||||||
|
padding: 10px; |
||||||
|
} |
||||||
|
</style> |
@ -0,0 +1,21 @@ |
|||||||
|
<template> |
||||||
|
<div class="child"> |
||||||
|
<h3>我是child组件(子)</h3> |
||||||
|
<son/> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import son from "@/components/Son.vue"; |
||||||
|
export default { |
||||||
|
name: "Child", |
||||||
|
components:{son} |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style> |
||||||
|
.child{ |
||||||
|
background-color: skyblue; |
||||||
|
padding: 10px; |
||||||
|
} |
||||||
|
</style> |
@ -0,0 +1,26 @@ |
|||||||
|
<template> |
||||||
|
<div class="son"> |
||||||
|
<h3>我是son组件(孙){{car.name}}-{{car.price}}</h3> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import {inject} from "vue"; |
||||||
|
|
||||||
|
export default { |
||||||
|
name: "Son", |
||||||
|
setup() { |
||||||
|
let car = inject('car') |
||||||
|
console.log('---son---', car) |
||||||
|
|
||||||
|
return {car} |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style scoped> |
||||||
|
.son{ |
||||||
|
background-color: orange; |
||||||
|
padding: 10px; |
||||||
|
} |
||||||
|
</style> |
Loading…
Reference in new issue