自学内容网 自学内容网

Vue非单文件组件

目录

Vue非单文件组件

几个注意点

组件的嵌套

 关于VueComponent

重要的内置关系


Vue非单文件组件

Vue中使用组件的三大步骤:
                    一、定义组件(创建组件)
                    二、注册组件
                    三、使用组件(写组件标签)

一、如何定义一个组件?
                        使用Vue.extend(options)创建,其中options和new Vue(options)时传入的那个options几乎一样,但也有点区别;
                        区别如下:
                                1.el不要写,为什么? ——— 最终所有的组件都要经过一个vm的管理,由vm中的el决定服务哪个容器。
                                2.data必须写成函数,为什么? ———— 避免组件被复用时,数据存在引用关系。
备注:使用template可以配置组件结构。

必须只有一个根节点、要想换行必须要用模版字符串,不然只能写在一行上面(es6模版字符串)

 二、如何注册组件?
                            1.局部注册:靠new Vue的时候传入components选项
                            2.全局注册:靠Vue.component('组件名',组件)

三、编写组件标签:
                            <school></school>
 

几个注意点

组件的嵌套

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>组件的嵌套</title>
<!-- 引入Vue -->
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<!-- 准备好一个容器-->
<div id="root">

</div>
</body>

<script type="text/javascript">
Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

//定义student组件
const student = Vue.extend({
name:'student',
template:`
<div>
<h2>学生姓名:{{name}}</h2>
<h2>学生年龄:{{age}}</h2>
</div>
`,
data(){
return {
name:'尚硅谷',
age:18
}
}
})

//定义school组件
const school = Vue.extend({
name:'school',
template:`
<div>
<h2>学校名称:{{name}}</h2>
<h2>学校地址:{{address}}</h2>
<student></student>
</div>
`,
data(){
return {
name:'尚硅谷',
address:'北京'
}
},
//注册组件(局部)
components:{
student
}
})

//定义hello组件
const hello = Vue.extend({
template:`<h1>{{msg}}</h1>`,
data(){
return {
msg:'欢迎来到尚硅谷学习!'
}
}
})

//定义app组件
const app = Vue.extend({
template:`
<div>
<hello></hello>
<school></school>
</div>
`,
components:{
school,
hello
}
})

//创建vm
new Vue({
template:'<app></app>',
el:'#root',
//注册组件(局部)
components:{app}
})
</script>
</html>

       

 关于VueComponent

            1.school组件本质是一个名为VueComponent的构造函数,且不是程序员定义的,是Vue.extend生成的。调用Vue.extend,就相当于new了一个VueComponent的实例对象

            2.我们只需要写<school/>或<school></school>,Vue解析时会帮我们创建school组件的实例对象, 即Vue帮我们执行的:new VueComponent(options)

option参数就相当于(红色框)

    3.特别注意:每次调用Vue.extend,返回的都是一个全新的VueComponent!!!!就是每次只要用了自定义组件,就会调用一次Vue.extend,那么就会创建一个新的VueComponent

解释:查看Vue.extend源码可以发现,当调用到了Vue.extend的时候,都会给你返回一个VueComponent,而且是var现定义的,所以每次调用Vue.extend都会产生一个姓的VueComponent,不是共用一个VueComponent

            4.关于this指向:

                (1).组件配置中:

                      data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【VueComponent实例对象】。

                (2).new Vue(options)配置中:

                      data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【Vue实例对象】。

            5.VueComponent的实例对象,以后简称vc(也可称之为:组件实例对象)。

              Vue的实例对象,以后简称vm。

区别:vm可以通过el指定为哪个容器服务,vc不能通过el指定

重要的内置关系

VueComponent.prototype.__proto__ === Vue.prototype
解释:为什么要有这个关系:让组件实例对象(vc)可以访问到 Vue原型上的属性、方法。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>一个重要的内置关系</title>
<!-- 引入Vue -->
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>

<!-- 准备好一个容器-->
<div id="root">
<school></school>
</div>
</body>

<script type="text/javascript">
Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
Vue.prototype.x = 99

//定义school组件
const school = Vue.extend({
name:'school',
template:`
<div>
<h2>学校名称:{{name}}</h2>
<h2>学校地址:{{address}}</h2>
<button @click="showX">点我输出x</button>
</div>
`,
data(){
return {
name:'尚硅谷',
address:'北京'
}
},
methods: {
showX(){
console.log(this.x)
}
},
})

</script>
</html>


原文地址:https://blog.csdn.net/2301_77451464/article/details/143869830

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!