Vue组件
如果将一个页面中所有的解决逻辑全副放在一起,解决起来就会变得非常复杂, 而且不利于后续治理以及扩大
但如果,咱们将一个页面拆分成一个个小的功能块,每个功能块实现属于本人这部分独立的性能,那么之后整个页面的治理和保护就变得容易
Vue组件化思维
组件化是Vue.js中的重要思维
- 提供里一种形象,让咱们能够开发出一个个独立可复用的小组件来结构咱们的利用
- 任何的利用都会被形象成一棵组件树
组件化思维的利用
- 有了组件化的思维,在之后开发尽可能将页面拆分成一个个小的,可复用的组件
- 这也让咱们的代码更加不便组织和治理,并且扩展性也更强
组建的应用分成三个步骤
- 创立组件结构器
- 注册组件
- 应用组件
Vue.component():
- 调用Vue.component()是将方才的组件结构器注册为一个组件,并且给它起一个组建的标签名称
- Vue.component(tagName, options)
tagName为组件名,options为配置选项
例子基于在Vue开发环境下<div id="app"> <my-cpn></my-cpn> //注册的组件</div><script> //1.创立组件结构器对象 const cpnC = Vue.extend({ template: ` <div> <h2>我是题目</h2> <p>我是内容,哈哈哈哈</p> <p>我是内容,呵呵呵呵呵</p> </div>` }) //2.注册组件 Vue.component('my-cpn', cpnC) const app = new Vue({ el: '#app', data: { } })</script>//此时组件内容就显示在页面
另一种写法
<div id="app"> <my-cpn></my-cpn> </div> <script> //注册组件 Vue.component('my-cpn', { template: ` //template的DOM构造必须被一个元素蕴含,如果间接写,不带<div></div>是无奈渲染的 <div> <h2>我是题目</h2> <p>我是内容,哈哈哈哈</p> <p>我是内容,呵呵呵呵呵</p> </div>` }) var app = new Vue({ el: '#app', data: { } }) </script>//此时组件内容就显示在页面
全局组件和部分组件
全局组件:意味着能够在多个Vue实例下应用
部分组件:在实例中,应用components选项能够部分注册组件,注册后的组件只有在该实例作用于下无效
//全局组件 <div id="app"> <my-cpn></my-cpn> </div> <script> //注册组件 Vue.component('my-cpn', { template: ` <div> <h2>我是题目</h2> <p>我是内容,哈哈哈哈</p> <p>我是内容,呵呵呵呵呵</p> </div>` }) var app = new Vue({ el: '#app', data: { } }) </script> //部分组件 <div id="app"> <my-cpn></my-cpn> </div> <script> var child = { template:'<div>部分注册组件的内容</div>' } var app = new Vue({ el:'#app', components:{ 'my-cpn':child } }) </script>
####父组件和子组件的区别
如果子组件未注册而应用,则会报错,如需应用,需在Vue实例对象内再注册
<div id="app"> <cpn2></cpn2> </div> <script> //1.创立第一个组件 const cpn1 = Vue.extend({ //子组件 template: ` <div> <h2>我是题目</h2> <p>我是内容</p> </div>` }) const cpn2 = Vue.extend({ //父组件 template: ` <div> <h2>我是题目2</h2> <p>我是内容2</p> <cpn1></cpn1> </div>`, components: { cpn1: cpn1 } }) var app = new Vue({ //root组件 el: '#app', components: { cpn2: cpn2 } }) </script> ####父子组件谬误用法:以子标签的模式在Vue实例中应用
- 因为当子组件注册到父组件components时,Vue会编译好父组件的模块
- 该模板的内容曾经决定了父组件将要渲染的HTML(相当于父组件中曾经有了子组件中的内容)
- <child-cpn></child-cpn>是只能在父组件中被辨认的
- 相似这种用法,<child-cpn></child-cpn>是会被浏览器疏忽的
注册组件语法糖
在之前注册组建的形式,可能有些繁琐
- Vue为了简化这个过程,提供了注册的语法糖
次要是省去了调用Vue.extend()的步骤,而是能够间接应用一个对象来代替
全局组件
原写法:调用extend
const cpnC = Vue.extend({ template: ` <div> <h2>我是源</h2> </div>` }) Vue.component('my-cpn', cpnC) const app = new Vue({ el: '#app', data: { } })
语法糖:外部调用虽仍是extend,但简略
<div id="app"> <my-cpn></my-cpn> </div> <script> Vue.component('my-cpn', { template: ` <div> <h2>我是语法糖</h2> </div>` }) var app = new Vue({ el: '#app', data: { } })
部分组件
var app = new Vue({ el:'#app', data:{}, components:{ 'cpnx':{ template:` <div> <h2>我是部分组件</div> </div>` } } })
组件模板的拆散写法
Vue提供了两种计划来定义HTML模块内容
- 应用<script>标签
- 应用<template>标签
通过script标签:留神类型必须是text/template
<div id="app"> <my-cpn></my-cpn> </div> <script typeof="text/x-template" id="my-cpn"> <div> <h2>我是题目</h2> <p>我是内容,哈哈哈哈</p> <p>我是内容,呵呵呵呵呵</p> </div> </script> <script> Vue.component('my-cpn', { template: `#my-cpn` }) const app = new Vue({ el: '#app', data: {} }) </script>
template标签
<div id="app"> <my-cpn></my-cpn> </div> <template id="cpn"> <div> <h2>语法糖</h2> <p>孙悟空,哈哈哈哈</p> <p>我是语法糖呵呵呵呵呵</p> </div> </template> <script> Vue.component('my-cpn', { template: `#cpn` }) const app = new Vue({ el: '#app', data: {} }); </script>