Vue3知识总结-4
文章目录
- Vue3知识总结-4
- 插槽Slots
- 渲染作用域
- 默认内容
- 具名插槽
- 插槽中的数据传递
- 具名插槽传递数据
- 组件声明周期
- 声明周期示意图
- 组件生命周期的应用
- 动态组件
- 组件保持存活
- 组件被卸载
- 异步组件
- 依赖注入
插槽Slots
在某些场景中,可能想要为子组件传递一些模版片段,让子组件在他们的组件中渲染这些片段
<template><SlotsBase><div><h3>插槽标题</h3><p>插槽内容</p></div></SlotsBase>
</template>
<script>
import SlotsBase from "@/components/SlotsBase.vue";
export default {components:{SlotsBase}
}
</script>
<style></style>
渲染作用域
插槽内容可以访问到父组件的数据作用域,因为插槽内容本心是在父组件模版中定义的
默认内容
如果没有传数据,可以有一个默认的值
具名插槽
插槽中的数据传递
需要同时使用父组件和子组件域内的数据。
具名插槽传递数据
<template><SlotsBase><div><h3>插槽标题</h3><p>插槽内容</p></div><template v-slot:header><h3>{123}</h3></template>
<!-- //简写的方式--><template #main><h3>{32131</h3></template><h3>{{message}}</h3><h3>{{currentTest}}</h3>
<!-- 传递数据--><SlotsBase v-slot="slotProps"><h3>{{currentTest}}-{{slotProps.msg}}</h3></SlotsBase>
<!-- 具名插槽传递数据--><SlotsBase><template #header="slotProps"><h3>{{currentTest}}-{{slotProps.msg}}</h3></template><template #main="slotProps"><h3>{{currentTest}}-{{slotProps.job}}</h3></template></SlotsBase></SlotsBase></template>
<script>
import SlotsBase from "@/components/SlotsBase.vue";
export default {data(){return{message:"插槽续集",currentTest:"测试内容"}},components:{SlotsBase}
}
</script>
<style></style>
<template><h3>base</h3><slot>插槽默认值</slot><hr><slot name="header">插槽默认值</slot><slot name="main">插槽默认值</slot><slot name="header" :msg="childMessage"></slot><slot name="main" :job="jobMsg"></slot>
</template><script>
export default {data(){return{childMessage:"子组件数据",jobMsg:"xiyou "}}
}
</script><style scoped></style>
组件声明周期
创建到销毁的生命周期
声明周期示意图
<template><h3>组件的生命周期</h3><p>{{message}}</p><button @click="updateHandle">更新数据</button>
</template>
<script>
//生命周期函数:
// 创建:beforeCreate created
// 挂载:beforeMount mounted
// 更新:beforeUpdate updated
// 销毁:beforeUnmount unmounted
export default {data(){return{message:"更新之前"}},methods:{updateHandle(){this.message = "更新之后"}},beforeCreate() {console.log("组件创建之前")},created() {console.log("组件创建之后")},beforeMount() {console.log("组件渲染之前")},mounted() {console.log("组件渲染之后")},beforeUpdate() {console.log("组件更新之前")},updated() {console.log("组件更新之后")},beforeUnmount() {console.log("组件销毁之前")},unmounted() {console.log("组件销毁之后")},}
</script>
组件生命周期的应用
- 通过ref获取元素DOM结构
- 迷你网络请求渲染数据
<template><h3>组件生命周期函数应用</h3><p ref="name">程序员</p><ul><li v-for="(item,index) of banner" :key="index"><h3>{{item.title}}</h3><p>{{item}}</p></li></ul>
</template><script>
export default {data(){return{banner: []}},created() {this.banner = [{"title":"123","content":"342"},{"title":"123","content":"342"},{"title":"123","content":"342"},]},beforeMount() {console.log(this.$refs.name)},mounted() {console.log(this.$refs.name)},
}
</script><style scoped></style>
动态组件
<template><component :is="tabComponent"></component><button @click="changeHandler">切换组件</button>
<!--<ComponentA/>-->
<!--<ComponentB/>-->
</template><script>import ComponentA from "@/components/ComponentA.vue"
import ComponentB from "@/components/ComponentB.vue"
export default {data(){return {tabComponent:"ComponentA"}},components:{ComponentA,ComponentB},methods:{changeHandler(){this.tabComponent = this.tabComponent == "ComponentA" ? "ComponentB" : "ComponentA"}}
}
</script>
组件保持存活
当使用在多个组件切换时候,被切换掉的组件会被卸载,可以用过组件强制被切换掉的组件任然保持“存活状态”
组件被卸载
<keep-alive><component :is="tabComponent"></component>
</keep-alive>
异步组件
同步:多个功能,一个一个执行
异步:多个动能,同时运行
依赖注入
Provide 和inject只能由上往下传递
<template>
<h3>Child</h3><p>{{title}}</p><p>{{message}}</p>
</template><script >
export default {inject: ['message'],props:{title:{type:String},}
}</script><style></style>
<template>
<h3>祖宗</h3><Parent title="祖宗的财产"/>
</template>
<script>
import Parent from "@/components/Parent.vue";
export default {data(){return{message:"123"}} ,components:{Parent},// provide:{// message:"213"// }provide(){return {message: this.message}}
}
</script>