1.创建组件:
var myComponent=Vue.extend({
template : '<div>component content</div>'
})
2.注册组件:
Vue.component("tag-name",myComponent)
1和2 也可以直接写成
Vue.component({
"tag-name":{"template":'<div>component content</div>'}
})
vue.js 背后会自动调用Vue.extend()
以上就注册了一个自定义元素“tag-name”
3.组件的使用
创建vue实例
new vue({
el:"#example"
})
html代码使用
<div id="example">
<tag-name></tag-name>
</div>
其中自定义元素部分会替换为该组件对应的template内容
自定义元素的作用只是用作一个挂载点
4.局部注册:
可以让组件只在其他组件内部使用
var child=Vue.extend({template:"<div></div>"})
var parent=Vue.extend({
template:“”,
components:{"child-tag":child }
})
只能在parent组件内使用child组件
5.模板解析
vue的模板为DOM模板。使用浏览器原生的解析器进行解析
6.Props 传递数据
可以使用props把数据传递给子组件
Vue.component("child",{
props:["myMessage"],
template:"<span>{{ myMessage }}</span>"
})
<child myMessage="hello"></child>
渲染为 :<span>hello</span>
7.props绑定类型
<child :msg=“parentMseg”></child> //默认单向
<child :msg.sync=“parentMseg”></child> //双向绑定
<child :msg.once=“parentMseg”></child> //单次绑定
8.props可以指定验证要求
Vue.component('example', {
props: {
// 基础类型检测 (`null` 意思是任何类型都可以)
propA: Number,
// 多种类型 (1.0.21+)
propM: [String, Number],
// 必需且是字符串
propB: {
type: String,
required: true
},
// 数字,有默认值
propC: {
type: Number,
default: 100
}
}})
9.父子组件
this.$parent可以访问子组件的父组件
this.$children 父组件的所有元素
10 .自定义事件
Vue实现了一个自定义事件接口,用于组件树中通信
每个vue实例都是一个事件触发器
使用$on() 监听事件
使用 $emit() 在他上面触发事件
使用 $dispatch() 派发事件,事件沿着父链冒泡
使用 $broadcast() 广播事件,事件向下传导给所有的后代
11.slot 插槽 内容分发API
父组件的内容将被抛弃,除非子组件模板包含<slot>,如果子组件有一个slot,父组件的所有内容将查到slot所在地方 并替换
子组件(my-component )定义如下模板:
<div>
<h1>this is my component!</h1>
<slot></slot>
<slot name="one"></slot>
<slot name="two"></slot>
</div>
父组件模板:
<my-component>
<p>this some orignal content </p>
<p slot="one">this some more content 1 </p>
<p slot="two">this some more content 2</p>
</my-component>
最后的渲染结果:
<div>
<h1>this is my component!</h1>
<p>this some orignal content </p>
<p slot="one">this some more content 1 </p>
<p slot="two">this some more content 2</p>
</div>
12 .动态组件
多个组件可以使用同一个挂载点,然后动态的在他们之间切换。使用
保留的<component>元素,动态绑定到is特性
new Vue({
el : "body",
data:{
currentView:"home"
},
components:{
home:{/* */},
posts:{/* */},
archive:{/* */}
} })
keep-alive 可以把切换出去的组件保留在内存中,可保留状态或避免重复渲染
<componet :is="currentView" keep-alive>
</componet>
13.两个动态组件之间的过渡(transition-mode)
in-out :新组件先进入 过渡完成之后当前组件过度出去
out-in :当前组件过渡出去,过渡完成之后新组件过渡进入
<component :is="view" transition="fade" transition-mode="out-in">
</component>
css 样式:
.fade-transition {
transition:opacity .3s ease;
}
.fade-enter , .fade-leave{
opcity:0;
}
14.组件和v-for
为了传递数据给组件,应当使用props
<my-component v-for="item in items" :item=item :index=$index>
</my-component>
15.可复用组件
可复用组件应当定义一个清晰的公开接口
vue.js组件API包含三部分: prop 事件 slot
prop :允许外部数据传递给组件
事件:允许组件触发外部环境的action
slot:允许外部环境插内容到组件的视图结构中去