Vue 非单文件组件

概述

  Vue 非单文件组件的创建与使用。

知识点

  •   组件的定义 :组件是能实现某个功能或具有某种属性的代码和资源集合。
  •   创建非单文件组件需要3个步骤:
    • 创建组件
    • 注册组件
    • 使用组件

创建组件

  使用Vue.extend(options)创建,格式与new Vue时几乎一样,但是这里有两点要注意;

  1. 不需要写el,因为组件是可复用的,不能固定在某一容器内。
  2. data必须写成函数,如果写成对象,这样组件复用时会引用同一个数据,所以只能写成函数形式,不同的组件data数据才会互不干扰。
  3. 如下图创建了2个组件:school 组件和student组件
     1  //创建school组件
     2     const school =Vue.extend({
     3         template:`<div>
     4             <h2>学校:{{schoolName}}</h2>
     5             <h2>地址:{{address}}</h2>
     6             </div>`,
     7         data(){
     8             return{
     9                 schoolName:'城西小学',
    10                 address:'南京市鼓楼区'
    11             }
    12             
    13         }
    14     });
    15     //创建student 组件
    16     const student =Vue.extend({
    17         template:`<div>
    18             <h2>学生:{{studentName}}</h2>
    19             <h2>年龄:{{age}}</h2>
    20             <h2>成绩:{{score}}</h2>
    21             <button @click=add>请点击我,成绩加一</button>
    22             </div>`,
    23         data(){
    24             return{
    25                 studentName:'李在容',
    26                 age:14,
    27                 score:56
    28             }
    29         },
    30         methods:{
    31             add(){
    32                 this.score++;
    33             }
    34         }
    35     });

     

注册组件

  • 注册局部组件
    • 在new Vue中使用components选项实现组件局部注册。
    • 如下图,我们在容器root 和root2上注册了相同的局部组件。
      var vm=new Vue(
              {
                  el:'#root',
                  //注册局部组件
                  components:{
                      xuexiao:school,
                      xuesheng:student
                  }
              }
          )
          var vm2=new Vue(
              {
                  el:'#root2',
                  //注册局部组件
                  components:{
                      xuexiao:school,
                      xuesheng:student
                  }
              }
          )

       

  • 注册全局组件
    • 使用Vue.component(组件名,组件)。
    • 如下图, 定义了一个组件,然后注册成全局组件。
       1  //创建hello组件
       2      const hello =Vue.extend({
       3         template:`<div>
       4             hello
       5             </div>`,
       6         data(){
       7             return{
       8                 msg:'我是hi组件',
       9             }
      10         },
      11         methods:{
      12             add(){
      13                 this.score++;
      14             }
      15         }
      16     });
      17     //注册全局组件
      18     Vue.component('hello',hello);

       

使用组件

  • 如下代码: 创建了3个组件student, school , hello组件
  • student 和 school组件被注册成局部组件,hello组件注册成全局组件。
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <script type="text/javascript" src="../js/vue.js"></script>
    </head>
    <body>
        <div id="root" style="border: 1px solid yellow; margin-top: 50px;">
            <!-- 编写组件标签 -->
            我使用的是局部组件
            <xuexiao></xuexiao>
            <hr>
            <xuesheng></xuesheng>
        </div>
        <div id="root3" style="border: 1px solid rgb(17, 0, 255); margin-top: 50px;">
            使用全局组件
            <hello></hello>
        </div>
        <div id="root2" style="border: 1px solid red; margin-top: 50px;">
            <!-- 编写组件标签 -->
            我使用的是局部组件
            <xuexiao></xuexiao>
            <hr>
            <xuesheng></xuesheng>
        </div>
       
    </body>
    <script type="text/javascript">
        Vue.config.productionTip=false;//阻止Vue在启动时生成生产提示
        //创建school组件
        const school =Vue.extend({
            template:`<div>
                <h2>学校:{{schoolName}}</h2>
                <h2>地址:{{address}}</h2>
                </div>`,
            data(){
                return{
                    schoolName:'城西小学',
                    address:'南京市鼓楼区'
                }
                
            }
        });
        //创建student 组件
        const student =Vue.extend({
            template:`<div>
                <h2>学生:{{studentName}}</h2>
                <h2>年龄:{{age}}</h2>
                <h2>成绩:{{score}}</h2>
                <button @click=add>请点击我,成绩加一</button>
                </div>`,
            data(){
                return{
                    studentName:'李在容',
                    age:14,
                    score:56
                }
            },
            methods:{
                add(){
                    this.score++;
                }
            }
        });
       
        var vm=new Vue(
            {
                el:'#root',
                //注册局部组件
                components:{
                    xuexiao:school,
                    xuesheng:student
                }
            }
        )
        var vm2=new Vue(
            {
                el:'#root2',
                //注册局部组件
                components:{
                    xuexiao:school,
                    xuesheng:student
                }
            }
        )
        var vm3=new Vue(
            {
                el:'#root3',
               
            }
        )
         //创建hello组件
         const hello =Vue.extend({
            template:`<div>
                hello
                </div>`,
            data(){
                return{
                    msg:'我是hi组件',
                }
            },
            methods:{
                add(){
                    this.score++;
                }
            }
        });
        //注册全局组件
        Vue.component('hello',hello);
    </script>
    </html>

     

效果图

  • 使用上面的代码执行后的效果如下
  • 如下图,虽然root和root2使用了相同的组件,但是每个组件互不影响。第一个组件里的年龄是59,第二个组件的年龄是56:

     

     

  

 

热门相关:美少女战士Sailor Moon 新辉夜岛传说   催情宝鉴番外篇之《月神貓》   我妈妈的朋友2   茶馆妈妈   傅爷怀里的假千金真绝了