3、toRef和context
使用toRef
解构的属性可能不存在,使用toRef给一个默认值,就能够在以后改变的时候实现响应式;
但并不建议这么做,无数据的时候可以给空,或者默认值;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>hello vue</title>
<!-- 引入Vue库 -->
<script src="https://unpkg.com/vue@next"></script>
</head>
<body>
<div id="root"></div>
</body>
<script>
const app = Vue.createApp({
// 我们想象中 2s 后 这里使用的 name 的值也会变成“大哥刘备”
template: `
<div>age: {{age}}</div>
`,
setup(props, context){
// 从 vue 引入 reactive
const { reactive, toRef } = Vue;
// 定义一个变量 nameObj 对象
let nameObj = reactive({name: 'zibo'});
const age = toRef(nameObj, 'age');
// 2s 后改变其内容
setTimeout(() => {
age.value = 25;
}, 2000);
return{
age
}
}
});
const vm = app.mount('#root');
</script>
</html>
复制代码
运行结果
context中的attrs和slots
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>hello vue</title>
<!-- 引入Vue库 -->
<script src="https://unpkg.com/vue@next"></script>
</head>
<body>
<div id="root"></div>
</body>
<script>
// 我们在父组件模板里面使用子组件 test 的时候,传参数
const app = Vue.createApp({
template: `
<test app="app">parent</test>
`,
});
app.component('test', {
// template:`
// <div>child</div>
// `,
setup(props, context){
const { h } = Vue;
const { attrs, slots, emit } = context;
console.log("attrs.app:", attrs.app); // 父组件传递过来的 None-Props 属性
console.log("slots.default():", slots.default()[0].children); // parent
console.log("slots.default():", slots.default()); // 获取插槽内容
// 不写 template ,使得 setup 函数返回一个虚拟 DOM 函数
return () => h('div', {}, slots.default());
}
});
const vm = app.mount('#root');
</script>
</html>
复制代码
运行结果
context中的emit
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>hello vue</title>
<!-- 引入Vue库 -->
<script src="https://unpkg.com/vue@next"></script>
</head>
<body>
<div id="root"></div>
</body>
<script>
// 我们在父组件模板里面使用子组件 test 的时候,传参数
const app = Vue.createApp({
methods: {
handleClick(){
console.log("父组件里面的 handleClick 事件被触发了!");
}
},
template: `
<test @handleClick="handleClick">parent</test>
`,
});
app.component('test', {
template:`
<div @click="handleClick">点我对外触发事件</div>
`,
setup(props, context){
const { h } = Vue;
const { emit } = context;
// emit 用于子组件对外触发事件
function handleClick(){
emit('handleClick');
}
return {
handleClick
}
}
});
const vm = app.mount('#root');
</script>
</html>
复制代码
运行结果
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END