该节教程代码可经过npm start运行devServer,在http://localhost:8080/查看效果css
示例代码:/lesson15/src/cmp1.jsvue
经过Vue.component能够注册一个组件,再将其导出到入口vm.js便可。git
import Vue from 'vue/dist/vue.esm';
// 经过Vue.component注册一个组件
export default Vue.component('cmp1', {
props: ['name', 'age', 'list'], // 定义要传入的props,在Vue中只有已定义的props才能够被组件接收到
data(){ // 组件的data必须是函数,为了保证组件的data做用域独立
return {a: 77, b: 55};
},
// 组件模板
template: `
<div>
姓名:{{name}}<br/>
年龄:{{age}}<br/>
<ul>
<li v-for="item in list">{{item}}</li>
</ul>
</div>
`
});
复制代码
示例代码:/lesson15/src/vm.jsgithub
能够直接经过<cmp1 name="Lee Chen" age="18" :list="[1, 2, 3]" />使用组件,这样不管何种状况,组件都会直接被渲染在页面中。npm
也能够经过通用组件<component :is="type" name="Lee Chen" age="18" :list="[1, 2, 3]" />使用,is属性为须要使用的组件名,经过改变该属性的值,能够控制渲染的组件。bootstrap
import Vue from 'vue/dist/vue.esm';
import Cmp1 from './cmp1';
let vm=new Vue({
el: '#div1',
data: {
type: 'cmp1'
},
// 局部组件
// 组件能够直接引入,也能够经过通用component组件引入,当is属性为特定组件名时,渲染相应组件。
template: `
<div>
能够尝试输入cmp1或my-dialog
<input type="text" v-model="type" />
<cmp1 name="Lee Chen" age="18" :list="[1, 2, 3]" />
<component :is="type" name="Lee Chen" age="18" :list="[1, 2, 3]" />
</div>
`
})
复制代码
组件还能够经过new关键字进行实例化,实例化后的组件主要用于测试。bash
// 实例化组件,主要用于测试
let cmp=new Cmp1({
propsData: {
name: '张三',
list: [88, 99, 27]
}
});
// 生成虚拟vm对象
let vm=cmp.$mount();
// vm.$el中存储了DOM,但不渲染在页面中
console.log(vm.$el);
// 测试代码
if(vm.$el.querySelector('li').innerHTML=='88'){
console.log('正确');
}else{
console.log('失败');
}
复制代码
咱们能够在模板中使用<slot />标记一个默认插槽位置,使用<slot name="title"/>标记一个具名插槽位置。less
在使用组件时,组件标签<my-dialog></my-dialog>内部的内容都为插槽内容。其中带有相应name属性的内容会被插入到<slot name="title"/>插槽的位置,其他内容会插入到默认插槽。函数
示例代码:/lesson15/src/my-dialog.js测试
import Vue from 'vue/dist/vue.esm';
import 'bootstrap/dist/css/bootstrap.css';
import './css/my-dialog.css';
export default Vue.component('my-dialog', {
data(){
return {};
},
template: `
<div class="panel panel-default my-dialog">
<div class="panel-heading">
<slot name="title"/>
</div>
<div class="panel-body">
<slot />
</div>
</div>
`
});
复制代码
示例代码:/lesson15/src/vm.js
import Vue from 'vue/dist/vue.esm';
import Cmp1 from './cmp1';
import MyDialog from './my-dialog';
let vm=new Vue({
el: '#div1',
data: {
type: 'cmp1'
},
// 局部组件
// 组件能够直接引入,也能够经过通用component组件引入,当is属性为特定组件名时,渲染相应组件。
template: `
<div>
能够尝试输入cmp1或my-dialog
<input type="text" v-model="type" />
<cmp1 name="Lee Chen" age="18" :list="[1, 2, 3]" />
<component :is="type" name="Lee Chen" age="18" :list="[1, 2, 3]" />
<my-dialog>
<!-- 名为title的插槽内容 -->
<template slot="title">标题</template>
一些文字文字文字
<!-- 默认插槽内容 -->
<ul>
<li>asdfas</li>
<li>asdfas</li>
</ul>
</my-dialog>
</div>
`
})
复制代码