vue如何主动销毁子组件_[vue]组件的创建(componet)和销毁(keep-alive缓存)和父子dom同步nextTick...

思路:

1. 组件的好处,重用性

2. 组件对的slot用法

3. 子如何调用父的数据

4. 子如何触发父的方法执行

5. 父如何触发子的方法执行

6. 如何创建组件和销毁自建--如何缓存避免每次切换创建

研究一下组件的销毁

- componet是vue内置命令,用于调用显示子组件

is="home": 根据组件名html通过is=""获取.

如下我定义了两个组件,home,list,然后我在html里将2个组件显示出来

componet事实上是创建了组件.

显示组件

let vm = new Vue({

el: "#app",

components: {

home: {

template: "

home
",

},

list: {

template: "

list
",

}

},

})

- 想要实现两个radio动态切换,类似页卡效果

- componet事实上是创建了组件.那么如何销毁组件呢

1.数据绑定到2个radio(注2个radio用value标识为一组)

2.componet获取radio的值作为自己获取的组件名

1.动态获取:is="radio"

组件动态切换

home:

list:

let vm = new Vue({

el: "#app",

data: {

radio: 'home'

},

components: {

home: {

template: "

home
",

},

list: {

template: "

list
",

}

},

})

- 用vue生命周期函数,研究下切换componet时候,每次都存在创建,销毁, 浪费资源了.

1.使用created/mounted 标识创建前动作

2.使用beforeDestory 标识销毁前动作

- keep-alive命令缓存componet,不至于每次都销毁创建, 节约资源.

组件动态切换

home:

list:

let vm = new Vue({

el: "#app",

data: {

radio: 'home'

},

components: {

home: {

template: "

home
",

mounted(){alert("创建前")},

beforeDestroy(){alert("销毁前")}

},

list: {

template: "

list
",

mounted(){alert("创建前")},

beforeDestroy(){alert("销毁前")}

}

},

})

1.先子组件的mounted

1,异步的,不会等dom渲染

2.在父组件的mounted

3.如果父操作子类的dom,要加上nextTick才能保证同步.(即子选mounted,后渲染,然后父mounted获取到子渲染后的数据)

mounted(){

console.log(this.$refs.child.$el.innerHTML); //

123

},

mounted(){

this.$nextTick(()=>{ // 想操作dom 就加一个nextTick

console.log(this.$refs.child.$el.innerHTML); //

456

})

},

{{a}}

let vm = new Vue({

el:'#app',

mounted(){

this.$nextTick(()=>{ // 想操作dom 就加一个nextTick

console.log(this.$refs.child.$el.innerHTML);

})

},

components:{

child:{

template:'#child',

data(){

return {arr:[1,2,3]}

},

mounted(){

this.arr = [4,5,6] // 此处是异步渲染dom

}

}

}

})

pannel栗子

maotai http://www.zhufengpeixun.cn
这是一篇vue的使用
内容区

组件的属性传递

slot的用法

ref的使用

nextTick的用法

作者:zfpx

let panel = {

template:'#panel',

computed:{

color(){return 'panel-'+this.type}

},

methods:{

say(){this.$emit('say-title',this.$refs.head.innerText)}

},

props:{

type:{ // this.type = 'primary'子不能更改父组件传递的属性

type:[String],

default:'default'

}

}

};

let vm = new Vue({

el:'#app',

methods:{

parent(tit){

alert(tit);

}

},

components:{

panel

}

});

pannel-for

maotai http://www.zhufengpeixun.cn
{{article.content}}
{{article.auth}}

let panel = {

template: '#panel',

computed: {

color() {

return 'panel-' + this.type

}

},

methods: {

say() {

this.$emit('say-title', this.$refs.head.innerText)

}

},

props: {

type: { // this.type = 'primary'子不能更改父组件传递的属性

type: [String],

default: 'default'

}

}

};

let vm = new Vue({

el: '#app',

data: {

articles: [

{type: 'warning', title: '

vue

', content: '这是vue的文章', auth: '作者:zfpx'},

{type: 'primary', title: '

react

', content: '这是react的文章'},

{type: 'danger', title: '

angular

', content: '这是react的文章'},

]

},

methods: {

parent(tit) {

alert(tit);

}

},

components: {

panel

}

});


版权声明:本文为weixin_35216188原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。