[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>