Vue生命周期中的组件化你知道吗

2022-10-14,,

这篇文章主要为大家详细介绍了Vue生命周期中的组件化,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

目录
  • 引出生命周期
    • 销毁流程
  • 生命周期
    • 生命周期总结
      • 组件化 
        • template:
      •  非单文件组件
        •  组件的几个注意点 
          •  组件的嵌套 
            •  VueComponent
              •  Vue实例与组件实例
                • 总结

                  引出生命周期

                  此时调用change,定时器回调修改opacity,数据修改,模板重新解析,再次调用change。

                  销毁流程

                  解绑(自定义)事件监听器

                  生命周期

                  生命周期总结

                   <div id="root">
                          <!-- <h2 :style="{opacity}">hello,{{name}}</h2> -->
                          <h2 :style="{opacity:opacity}">hello,{{name}}</h2>
                          <button @click="stop">click stop</button>
                          <button @click="opacity = 1">opacity 1</button>
                      </div>
                      <script type="text/javascript">
                          Vue.config.productionTip = false;
                          new Vue({
                              el: "#root",
                              data: {
                                  name: "atguigu",
                                  opacity: 1,
                              },
                              methods: {
                                  stop(){
                                      this.$destroy();
                                  }
                              },
                              beforeDestroy() {
                                  clearInterval(this.timer);
                              },
                              //vue完成模板解析,并把初始的真实的dom元素放入页面后(挂载完毕),会调用该函数。
                              mounted() {
                                  this.timer = setInterval(() => {
                                      this.opacity -= 0.01;
                                      if (this.opacity <= 0) { this.opacity = 1 }
                                  }, 16);
                              },
                          });
                      </script>

                  组件化 

                  template:

                  整个root容器当作模板

                  会直接替换掉root,把template当作模板进行解析。 

                   

                   非单文件组件

                  data需要用函数式写法

                  <div id="root">
                          <h2>{{msg}}</h2>
                         <!--组件标签-->
                         <school>
                         </school>
                         <hr>
                         <student>       
                         </student>
                         <student>   
                         </student>
                         <hello>
                         </hello>
                      </div>
                      <div id="root2">
                      </div>
                      <script type="text/javascript">
                          Vue.config.productionTip = false;
                          //创建school组件
                         const school = Vue.extend({
                              template:`
                              <div>
                                  <h2>schoolname:{{schoolname}}</h2>
                                   <h2>schoolage{{schoolage}}</h2>
                                   <button @click='show'>点击提示</button>
                              </div>
                              `,
                              data(){
                                  return{
                                      schoolname: "atguigu",
                                      schoolage:20,
                                  }
                              },
                              methods: {
                                  show(){
                                      alert(this.schoolname);
                                  }
                              },
                         });
                         //创建stu组件
                         const student = Vue.extend({
                          template:`
                              <div>
                                  <h2>stuname:{{stuname}}</h2>
                                  <h2>stuage{{stuage}}</h2>
                              </div>
                              `,
                              data(){
                                  return{
                                      stuname:'tom',
                                      stuage:18,
                                  }
                              },
                         });
                         //创建hello组件
                         const hello = Vue.extend({
                              template:`
                              <div>
                                  <h2>stuname:{{stuname}}</h2>
                                  <h2>stuage{{stuage}}</h2>
                              </div>
                              `,
                              data(){
                                  return{
                                      stuname:'tom',
                                      stuage:18,
                                  }
                              },
                         });
                         //全局注册组件
                         Vue.component('hello',hello);
                          new Vue({
                              el: "#root",
                              data:{
                                  msg:'this is msg'
                              },
                              //局部注册组件
                              components:{
                                  school:school,
                                  student,
                              }
                          });
                      </script>

                   组件的几个注意点 

                   组件的嵌套 

                  <!DOCTYPE html>
                  <html lang="en">
                  <head>
                      <meta charset="UTF-8">
                      <meta http-equiv="X-UA-Compatible" content="IE=edge">
                      <meta name="viewport" content="width=device-width, initial-scale=1.0">
                      <script type="text/javascript" src="../js/vue.js"></script>
                      <title>Document</title>
                  </head>
                  <body>
                      <div id="root">
                      </div>
                      <script type="text/javascript">
                          Vue.config.productionTip = false;
                          //创建student组件
                          const student = Vue.extend({
                              template:`
                              <div>
                                  <h2>stuname:{{stuname}}</h2>
                                  <h2>stuage{{stuage}}</h2>
                              </div>
                              `,
                              data(){
                                  return{
                                      stuname:'tom',
                                      stuage:18,
                                  }
                              },
                         });
                          //创建school组件
                         const school = Vue.extend({
                              template:`
                              <div>
                                  <h2>schoolname:{{schoolname}}</h2>
                                   <h2>schoolage{{schoolage}}</h2>
                                   <button @click='show'>点击提示</button>
                                   <student></student>
                              </div>
                              `,
                              data(){
                                  return{
                                      schoolname: "atguigu",
                                      schoolage:20,
                                  }
                              },
                              methods: {
                                  show(){
                                      alert(this.schoolname);
                                  }
                              }, 
                              components:{
                                  student:student,               
                              }  
                         });
                         //创建hello组件
                         const hello = Vue.extend({
                              template:`
                              <div>
                                  <h2>{{msg}}</h2>
                              </div>
                              `,
                              data(){
                                  return{
                                      msg:'hello!'
                                  }
                              },
                         });
                         const app = Vue.extend({
                             template:`
                                  <div>
                                      <hello></hello>
                                      <school></school>
                                  </div>
                             `,
                             components:{
                                  school,
                                  hello,              
                              } 
                         })
                         //vue
                          new Vue({
                              template:'<app></app>',
                              el: "#root",
                              //局部注册组件
                              components:{
                                  app,             
                              }         
                          });
                      </script>
                  </body>
                  </html>

                   VueComponent

                  每次调用extend,都返回了一个VueComponent

                  <!DOCTYPE html>
                  <html lang="en">
                  <head>
                      <meta charset="UTF-8">
                      <meta http-equiv="X-UA-Compatible" content="IE=edge">
                      <meta name="viewport" content="width=device-width, initial-scale=1.0">
                      <script type="text/javascript" src="../js/vue.js"></script>
                      <title>Document</title>
                  </head>
                  <body>
                      <div id="root">
                          <!--组件标签-->
                          <school>
                          </school>
                          <hello>
                          </hello>
                      </div>
                      <div id="root2">
                      </div>
                      <script type="text/javascript">
                          Vue.config.productionTip = false;
                          //创建school组件
                          const school = Vue.extend({
                              template: `
                              <div>
                                  <h2>schoolname:{{schoolname}}</h2>
                                   <h2>schoolage{{schoolage}}</h2>
                                   <button @click='show'>点击提示</button>
                              </div>
                              `,
                              data() {
                                  return {
                                      schoolname: "atguigu",
                                      schoolage: 20,
                                  }
                              },
                              methods: {
                                  show() {
                                      console.log(this)//VueComponent实例对象  vc
                                      alert(this.schoolname);
                                  }
                              },
                          });
                          //创建hello组件
                          const hello = Vue.extend({
                              template: `
                              <div>
                                  <h2>hello:{{hello}}</h2>
                              </div>
                              `,
                              data() {
                                  return {
                                      hello: "hello",
                                  }
                              },
                          });
                          console.log(school);//一个构造函数
                          console.log(hello);//一个构造函数
                          console.log(school === hello);//false
                          new Vue({
                              el: "#root",
                              data: {
                              },
                              //局部注册组件
                              components: {
                                  school: school,
                                  hello:hello,
                              }
                          });
                      </script>
                  </body>
                  </html>

                   Vue实例与组件实例

                  总结

                  本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注北冥有鱼的更多内容!  

                  您可能感兴趣的文章:

                  • vue组件生命周期钩子使用示例详解
                  • Vue组件生命周期运行原理解析
                  • Vue父组件监听子组件生命周期
                  • vue同步父子组件和异步父子组件的生命周期顺序问题
                  • 深入理解Vue父子组件生命周期执行顺序及钩子函数
                  • Vue组件和Route的生命周期实例详解
                  • vue组件生命周期详解
                  • 深入理解Vue生命周期、手动挂载及挂载子组件
                  • Vue 全部生命周期组件梳理整理

                  《Vue生命周期中的组件化你知道吗.doc》

                  下载本文的Word格式文档,以方便收藏与打印。