一、动态组件
<component> 是vue的内置组件,必须要有一个is属性 ,is的值要用data中的一个键作为值,可以实现动态切换组件
用法:
组件A
<template>
<div>
用户名:
<input type="text" name="" id="" />
密码:
<input type="password" name="" id="" />
个人信息:
<textarea name="" id="" cols="30" rows="10"></textarea>
</div>
</template>
<script>
export default {}
</script>
<style scoped></style>
组件B
<template>
<div>
用户名:
<input type="text" name="" id="" />
密码:
<input type="password" name="" id="" />
</div>
</template>
<script>
export default {}
</script>
<style></style>
将组件AB引入组件C
<template>
<div>
<h1>动态组件</h1>
<button @click="comName = 'UserName'">点击1</button>
<button @click="comName = 'UserInfo'">点击2</button>
<div>
<keep-alive>
<component :is="comName"></component>
</div>
wwaq
</div>
</template>
<script>
import UserName from './UserName.vue'
import UserInfo from './UserInfo.vue'
export default {
data() {
return {
comName: 'UserName',
}
},
methods: {},
components: { UserName, UserInfo },
}
</script>
<style></style>
将组件C放入app.vue内
<template>
<div>
<UserDyName></UserDyName>
</div>
</template>
<script>
import UserDyName from './components/UserDyName.vue'
export default {
components: { UserDyName },
}
</script>
<style></style>
二、组件缓存
<keep-alive>组件可用动态缓存组件内的信息,切换组件后不会消失
用法:用keep-alive将component包裹起来,不会触发vue的生命周期,如果没有keep-alive切换之后则会直接销毁component内的内容
<template>
<div>
<h1>动态组件</h1>
<button @click="comName = 'UserName'">点击1</button>
<button @click="comName = 'UserInfo'">点击2</button>
<div>
<keep-alive>
<component :is="comName"></component>
</keep-alive>
</div>
wwaq
</div>
</template>
<script>
import UserName from './UserName.vue'
import UserInfo from './UserInfo.vue'
export default {
data() {
return {
comName: 'UserName',
}
},
methods: {},
components: { UserName, UserInfo },
}
</script>
<style></style>
<keep-alive>组件的两个生命周期activated和deactivated
用法:
<template>
<div>
用户名:
<input type="text" name="" id="" />
密码:
<input type="password" name="" id="" />
</div>
</template>
<script>
export default {
created() {
console.log('Name被创建了')
},
beforeDestroy() {
console.log('Name被销毁了')
},
activated() {
console.log('Name被激活了')
},
deactivated() {
console.log('Name失去激活')
},
}
</script>
<style></style>
三、组件插槽
-
用法:
-
组件内用<slot></slot>占位
-
使用组件时<Pannel></Pannel>夹着的地方, 传入标签替换slot
-
子组件引入:
-
<template> <div> <!-- 按钮标题 --> <div class="title"> <h4>芙蓉楼送辛渐</h4> <span class="btn" @click="isShow = !isShow"> {{ isShow ? '收起' : '展开' }} </span> </div> <!-- 下拉内容 --> <div class="container" v-show="isShow"> <slot></slot> </div> </div> </template> <script> export default { data() { return { isShow: false, } }, } </script> <style scoped> h3 { text-align: center; } .title { display: flex; justify-content: space-between; align-items: center; border: 1px solid #ccc; padding: 0 1em; } .title h4 { line-height: 2; margin: 0; } .container { border: 1px solid #ccc; padding: 0 1em; } .btn { /* 鼠标改成手的形状 */ cursor: pointer; } img { width: 50%; } </style>
父组件引入:
-
<template> <div> <!-- <UserDyName></UserDyName> --> <Pannel> <p>寒雨连江夜入吴,</p> <p>平明送客楚山孤。</p> <p>洛阳亲友如相问,</p> <p>一片冰心在玉壶。</p> </Pannel> <Pannel> <div> <img src="图片地址" alt="" /> </div> </Pannel> <Pannel></Pannel> </div> </template> <script> import UserDyName from './components/UserDyName.vue' import Pannel from './components/Pannel.vue' export default { components: { UserDyName, Pannel }, } </script> <style></style>
-
四、默认插槽内容
-
slot可以设置默认显示的属性,直接在slot内写入即可
<div class="container" v-show="isShow"> <slot> 我是默认的 </slot> </div>
五、自定义插槽
-
用v-slot:组件名 绑定自定义组件(v-slot简写为#)
-
子组件通过slot标签的name属性创建一个值,父组件通过templat标签的v-slot属性接收
-
子组件
-
<template> <div> <!-- 按钮标题 --> <div class="title"> <!-- <h4>芙蓉楼送辛渐</h4> --> <slot name="title">默认头部</slot> <span class="btn" @click="isShow = !isShow"> {{ isShow ? '收起' : '展开' }} </span> </div> <!-- 下拉内容 --> <div class="container" v-show="isShow"> <slot name="content"> 默认内容 </slot> </div> </div> </template>
父组件引用
-
<template> <div> <!-- <UserDyName></UserDyName> --> <Pannel> <template #title> <h4>芙蓉楼送辛渐</h4> </template> <template #content> <p>寒雨连江夜入吴,</p> <p>平明送客楚山孤。</p> <p>洛阳亲友如相问,</p> <p>一片冰心在玉壶。</p> </template> </Pannel> <Pannel> <template #title> <h4>蕾姆</h4> </template> <template #content> <img src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fi0.hdslb.com%2Fbfs%2Farticle%2F7a6e7684c7b3fc8acf90bedc3cbd1ba8106e85ba.jpg&refer=http%3A%2F%2Fi0.hdslb.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1665547487&t=3214fe93ca0737750c9f6b5c909b734b" alt="" /> </template> </Pannel> <Pannel></Pannel> </div> </template> <script> import UserDyName from './components/UserDyName.vue' import Pannel from './components/Pannel.vue' export default { components: { UserDyName, Pannel }, } </script> <style></style>
六、作用域组件
-
子组件内通过:row属性将要穿出的对象写入:row="defaultObj",父组件 v-slot="scope"属性接收子组件穿出的对象,再将值写入到标签内 {{ scope.row.defaultOne }}
-
子组件
<template> <div> <!-- 按钮标题 --> <div class="title"> <!-- <h4>芙蓉楼送辛渐</h4> --> <slot name="title">默认头部</slot> <span class="btn" @click="isShow = !isShow"> {{ isShow ? '收起' : '展开' }} </span> </div> <!-- 下拉内容 --> <div class="container" v-show="isShow"> <slot name="content"> 默认内容 </slot> <slot :row="defaultObj"></slot> </div> </div> </template> <script> export default { data() { return { isShow: false, defaultObj: { defaultOne: '无名氏', defaultTwo: '小传同学', }, } }, } </script> <style scoped> h3 { text-align: center; } .title { display: flex; justify-content: space-between; align-items: center; border: 1px solid #ccc; padding: 0 1em; } .title h4 { line-height: 2; margin: 0; } .container { border: 1px solid #ccc; padding: 0 1em; } .btn { /* 鼠标改成手的形状 */ cursor: pointer; } img { width: 50%; } </style>
父组件
-
<template> <div> <!-- <UserDyName></UserDyName> --> <Pannel> <template #title> <h4>芙蓉楼送辛渐</h4> </template> <template #content> <p>寒雨连江夜入吴,</p> <p>平明送客楚山孤。</p> <p>洛阳亲友如相问,</p> <p>一片冰心在玉壶。</p> </template> </Pannel> <Pannel> <template #title> <h4>蕾姆</h4> </template> <template #content> <img src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fi0.hdslb.com%2Fbfs%2Farticle%2F7a6e7684c7b3fc8acf90bedc3cbd1ba8106e85ba.jpg&refer=http%3A%2F%2Fi0.hdslb.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1665547487&t=3214fe93ca0737750c9f6b5c909b734b" alt="" /> </template> </Pannel> <Pannel> <template v-slot="scope"> <h1> {{ scope.row.defaultOne }} </h1> <h1> {{ scope.row.defaultTwo }} </h1> </template> </Pannel> </div> </template> <script> import UserDyName from './components/UserDyName.vue' import Pannel from './components/Pannel.vue' export default { components: { UserDyName, Pannel }, } </script> <style></style>