[Vue]组件入门——非单文件组件

 
Vue中使用组件的三大步骤:
1. 定义组件(创建组件)
    使用Vue.extend(options)创建,其中options和new Vue(options)时传入的options几乎一样,但有点区别:
    (1) el不要写: 最终所有的组件都要经过一个vm的管理,由vm中的el决定服务哪个容器
    (2) data必须写成函数: 避免组件被复用时,数据存在引用关系。
    (3) 使用template配置组件结构。
2. 注册组件
    (1) 局部注册: 靠new Vue的时候传入components(组件名)
    (2) 全局注册: 靠Vue.component('组件名',组件)
3. 使用组件(写组件标签)
    <school></school>  在dom中直接写组件,不要写成闭合标签
 
几个注意点
1. 关于组件名:
    一个单词组成:
    (1). 首字母小写: school
    (2). 首字母大写: School
    多个单词组成:
    (1). kebab-case命名: my-school
    (2). CamelCase命名: MySchool(需要Vue脚手架支持)
    备注:
    (1). 组件名尽可能回避HTML中已有的元素名称,例如: h2、H2都不行。
    (2). 可以使用name配置项指定组件在开发者工具中呈现的名字。
2. 关于组件标签:
    (1). <school></school>
    (2). <school/>
    备注: 不用使用脚手架时,<school/>会导致后续组件不能渲染。
3. 一个简写方式:
    const school = Vue.extend(options)  可简写为:const school = options
    vue在注册组件时有判断,如果传入的仅仅是配置项文件,vue会自动调用Vue.extend()
 
关于 Vue Component:
1. school组件本质是一个名为VueComponent的构造函数,且不是程序员定义的,是Vue.extend生成的。
2. 我们只需要写<school/>或<school></school>,Vue解析时会帮我们创建school组件的实例对象,
   即Vue帮我们执行的: new VueComponent(options)。
3. 特别注意: 每次调用Vue.extend,返回的都是一个全新的VueComponent!!!!
4. 关于this指向:
   (1).组件配置中:
    data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是[VueComponent实例对象]
   (2).new Vue(options)配置中:
    data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是[Vue实例对象]。
5.Vue Component的实例对象,以后简称vc (也可称之为: 组件实例对象)。
  Vue的实例对象,以后简称vm。
 
局部注册:
<body>
    <div id="root">
        <!-- 第3步:编写组件标签 -->
        <!-- 注意:在dom里面写组件不可以写成闭合标签! -->
        <school></school>
        <hr />
        <student></student>
    </div>
</body>
<script>
    // 第1步:创建组件 Vue.extend
    const school = Vue.extend({
        template: `
            <div>
                <h2> {{schoolName}}</h2>
                <h2> {{schoolAge}}</h2>
                <button @click="alter_school_name">点我提示学校名</button>
            </div>
        `,
        data: function () {
            return {
                schoolName: 'xx小学',
                schoolAge: 10
            }
        },
        methods: {
            alter_school_name: function () {
                alert(this.schoolName)
            }
        },
    })
    const student = Vue.extend({
        template: `
            <div>
                <h2> {{studentName}}</h2>
                <h2> {{studentAge}}</h2>
            </div>
        `,
        data: function () {
            return {
                studentName: '张三',
                studentAge: 8
            }
        }
    })
    let vm = new Vue({
        el: "#root",
        // 第2步:注册组件(局部注册) components
        components: { school, student },
        // 下面的写法也可以,但没必要
        // components: {
        //     student: student,
        //     school: school
        // },
    })
</script>

 

全局注册:

<body>
    <div id="root1">
        <!-- 第3步:编写组件标签 -->
        <hello></hello>
    </div>
    <div id="root2">
        <hello></hello>
    </div>
</body>
<script>
    // 第1步:创建组件 Vue.extend
    const hello = Vue.extend({
        template: `
            <div>
                <h2>你好! {{name}}</h2>
            </div>
        `,
        data: function () {
            return {
                name: '全局绑定'
            }
        }
    })
    // 第2步:注册组件(全局注册)Vue.component('组件名', 组件名)
    Vue.component('hello', hello)
    let vm1 = new Vue({
        el: "#root1",
    })
    let vm2 = new Vue({
        el: '#root2'
    })
</script>

 

posted @ 2023-11-02 08:54  夕苜19  阅读(23)  评论(0编辑  收藏  举报