一、内置组件component
1、component简介
有的时候,在不同组件之间进行动态切换是非常有用的。这时候就需要使用动态组件。
通过 Vue 的 <component>
元素加一个特殊的 is
属性来实现,写法:
<component :is=''> </component> 多个组件使用同一个挂载点,然后动态的在他们之间切换。
2、代码实例
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>动态组件</title> 6 <!--引入vue--> 7 <script src="../js/vue.js"></script> 8 </head> 9 <body> 10 11 <div id="hello"> 12 <button @click="flag='my-hello'">显示hello组件</button> 13 <button @click="flag='my-world'">显示world组件</button> 14 15 <!-- 该区域动态显示组件 --> 16 <div> 17 <component :is='flag'></component> 18 </div> 19 20 </div> 21 22 23 <script> 24 25 //vue实例 26 let vm = new Vue({ //vm其实也是一个组件,是根组件Root 27 el:'#hello', 28 data:{ 29 flag:'my-hello' //设置初始显示组件 30 }, 31 components:{ 32 'my-hello':{ 33 template:'<h2>我是hello组件</h2>>' 34 }, 35 'my-world':{ 36 template:'<h1>我是world组件</h1>>' 37 } 38 } 39 40 }); 41 </script> 42 </body> 43 </html>
二、内置组件keep-alive
1、keep-alive简介
动态组件默认每次切换都会销毁组件并重新创建,这样会影响性能。为了解决这个问题,可以使用keep-alive组件缓存非活动组件,可以保留状态,避免重新渲染。
2、keep-alive使用方法
在动态显示的挂载器套上<keep-alive></keep-alive>组件即可。
3、代码实例
默认每次切换组件都会生成一次随机数,套上keep-alive组建后,每次动态切换就不会再重新生成随机数,只是带出上一次获取的随机数。
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>动态组件</title> 6 <!--引入vue--> 7 <script src="../js/vue.js"></script> 8 </head> 9 <body> 10 11 <div id="hello"> 12 <button @click="flag='my-hello'">显示hello组件</button> 13 <button @click="flag='my-world'">显示world组件</button> 14 15 <!-- 该区域动态显示组件 --> 16 <div> 17 <!-- 使用keep-alive组件缓存非活动组件,可以保留状态,避免重新渲染,默认每次切换都会销毁组件并重新创建 --> 18 <keep-alive> 19 <component :is='flag'></component> 20 </keep-alive> 21 </div> 22 23 </div> 24 25 26 <script> 27 28 //vue实例 29 let vm = new Vue({ //vm其实也是一个组件,是根组件Root 30 el:'#hello', 31 data:{ 32 flag:'my-hello' //设置初始显示组件 33 }, 34 components:{ 35 'my-hello':{ 36 template:'<h2>我是hello组件:{{x}}</h2>', 37 data(){ 38 return { 39 x:Math.random() 40 } 41 } 42 }, 43 'my-world':{ 44 template:'<h1>我是world组件{{y}}</h1>', 45 data(){ 46 return { 47 y:Math.random() 48 } 49 } 50 } 51 } 52 53 }); 54 </script> 55 </body> 56 </html>