小程序开发|小程序制作|小程序开发网

搜索

vue 父子组件生命周期调用顺序及混入mixin使用

2023-2-21 15:37| 发布者: 牛摩的| 查看: 510| 评论: 1

摘要: 总的来说,从创建到挂载,是从外到内,再从内到外,且mixins的钩子函数总是在当前组件之前执行。1、父子组件调用顺序渲染过程:父beforeCreate-->父created-->父beforeMount-->子beforeCreate-->子created-->子befor

总的来说,从创建到挂载,是从外到内,再从内到外,且mixins的钩子函数总是在当前组件之前执行。
1、父子组件调用顺序
渲染过程:父beforeCreate-->父created-->父beforeMount-->子beforeCreate-->子created-->子beforeMount-->子mounted-->父mounted;
更新过程:父beforeUpdate-->子beforeUpdate-->子updated-->父updated;
销毁过程:父beforeDestroy-->子beforeDestroy-->子destroyed-->父destroyed;
理解:子组件在父组件内部,所以从父组件开始初始化,中间遇到子组件再进行子组件的渲染和初始化,最后由父组件完成。
2、mixins混入个人感觉可以理解为类的继承,将数据和公共的方法通过export default{}导出,里面内容按照vue语法写data methods created等等内容,,然后在需要的vue文件中引入mixins js文件,引入时同名方法会被vue文件中方法覆盖,不同方法和数据会和vue文件进行合并。
3、示例
demo.html

  

{{demo}}

directive.js

Vue.directive("init", {  bind: function (el) {    console.log("v-init el is ", el);  }})

demo.js

let mixin = {  data() {    return {      msg: "mixinMsg",    }  },  beforeCreate() {    console.log("mixin beforeCreate");  },  created() {    console.log("mixin created");  },  beforeMount() {    console.log("mixin beforeMount");  },  mounted() {    console.log("mixin mounted");  },  beforeUpdate() {    console.log("mixin beforeUpdate");  },  updated() {    console.log("mixin updated");  },  methods: {    say() {      console.log("mixin methods say ");    }  }}var child = Vue.component("child", {  template: `

child template : {{msg}} {{child}}

`, name: "child", mixins: [mixin], data() { return { child: 0 } }, beforeCreate() { console.log("child beforeCreate"); }, created() { console.log("child created"); }, beforeMount() { console.log("child beforeMount"); }, mounted() { console.log("child mounted"); }, beforeUpdate() { console.log("child beforeUpdate"); }, updated() { console.log("child updated"); }, beforeDestroy() { console.log("child beforeDestroy"); }, destroyed() { console.log("child destroyed"); }, methods: { sayChild() { this.msg = "childMsg"; this.child++; console.log("child methods sayDemo child ", this.child); }, say() { console.log("child methods say "); }, }})let vm = new Vue({ el: "#demo", components: { child: child }, data() { return { demo: 0 } }, mixins: [mixin], beforeCreate() { console.log("demo beforeCreate"); }, created() { console.log("demo created"); }, beforeMount() { console.log("demo beforeMount"); }, mounted() { console.log("demo mounted"); }, beforeUpdate() { console.log("demo beforeUpdate"); }, updated() { console.log("demo updated"); }, beforeDestroy() { console.log("demo beforeDestroy"); }, destroyed() { console.log("demo destroyed"); }, methods: { sayDemo() { console.log("demo methods sayDemo "); }, increase() { this.demo++; console.log("demo methods increase demo ", this.demo); }, destroy() { console.log("demo methods destroy "); vm.$destroy(); }, }})

控制台输出
渲染过程:



更新过程:
父组件



子组件

销毁过程:

总结:生命周期遵从“从外到内,再从内到外,mixins先于组件”的原则。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

鲜花

握手

雷人

路过

鸡蛋
发表评论

最新评论

引用 心影大都 2023-5-4 18:47
很不错

查看全部评论(1)

返回顶部