1. 什么是Vue?
Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。
2. 安装Vue
建立一个html文件,在head部分引用vue在线包(当然,您也可以下载下来使用)
开发环境包:
<!-- 开发环境版本,包含了用帮助的命令行警告 --> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
生产环境包:
<!-- 生产环境版本,优化了尺寸和速度 --> <script src="https://cdn.jsdelivr.net/npm/vue"></script>
3. 入门
Vue就是通过实例化一个Vue对象,传入一个selector,一个控制器来实现各种UI渲染的。
3.1. 文本渲染
html
<span class="test">
{{ message }}
</span>script
var app = new Vue({
el: '.test',
data: {
message: '这是一段文本'
}
});
app.message = '新文本';3.2. 绑定title
html
<span class="test"> <b v-bind:title="message">鼠标悬停几秒显示title信息</b> </span>
script
var app = new Vue({
el: '.test',
data: {
message: '这是title标题信息'
}
});3.3. 条件控制
html
<span class="test"> <b v-if="seen">看到了吗?</b> </span>
script
var app = new Vue({
el: '.test',
data: {
seen:false
}
});
app.seen = true;3.4. 循环
html
<span class="test">
<ul>
<li v-for="item in arr"><b>{{ item.text }}</b></li>
</ul>
</span>script
var app = new Vue({
el: '.test',
data: {
arr:[
{text:"A"},
{text:"B"},
{text:"C"}
]
}
});
app.arr.push({text:"D"});3.5. 事件
html
<span class="test">
<a v-on:click="funName">{{ message }}</a>
</span>script
var app = new Vue({
el: '.test',
data: {
message : '请点击我'
},
methods: {
funName : function(){
this.message = '刚刚点击了我';
}
}
});3.6. 表单项绑定
html
<span class="test">
<label>{{ selected }}</label>
<select v-model="selected">
<option>无选择</option>
<option value="A">A</option>
<option value="B">B</option>
<option value="C">C</option>
</select>
</span>script
var app = new Vue({
el: '.test',
data: {
selected : 'C'
}
});3.7. 组件
script(模板定义)
Vue.component('li-item', {
props : ['item'],
template: '<li>{{ item.text }}</li>'
});html
<span class="test"> <ol> <li-item v-for="li in olList" v-bind:item="li" v-bind:key="li.id"> </li-item> </ol> </span>
script
var app = new Vue({
el: '.test',
data: {
olList : [
{id:1, text:'A'},
{id:2, text:'B'},
{id:3, text:'C'}
]
}
});4. 牛刀小试
4.1. 应用于表格
5. TFWEB的Vue
5.1. 命名规则
组件内部的信息类的属性,我们统一放到 info 这个集合里,例如:info : { title : 'title', desc : 'desc' ... }
组件内部的子组件,可以考虑使用独立的集合,例如:options : { ... } elements : { ... }
组件内部的插槽,可以考虑使用独立的集合
5.2. 属性绑定
属性名称不区分大小写,需要用“-”分隔,但是JSON数据的节点名称如果包含“-”又必须用引号括起来。将“-”替换成“_”是个不错的选择。
<my-component :isSpec="isSpec"></my-component>
这里的 isSpec 会被转移成 isspec,在接收的时候也必须用 props : { isspec : { } } 接收
<my-component :is-spec="isSpec"></my-component>
这里的 is-spec 包含“-”,在接收的时候必须加引号括起来 props : { 'is-spec' : { } } 接收
<my-component :is_spec="isSpec"></my-component>
这里的 is_spec 包含“_”,在接收的时候可直接 props : { is_spec : { } } 接收5.3. 事件绑定
事件名称不区分大小写,需要用“-”分隔,但是JSON数据的节点名称如果包含“-”又必须用引号括起来。将“-”替换成“_”是个不错的选择。
<my-component @callSpec="callSpec"></my-component>
这里的 callSpec 会被转移成 callspec,对应的方法名称也应该是 callspec : function(){ }
<my-component @call-spec="callSpec"></my-component>
这里的 call-spec 包含“-”,对应的方法名称也应该是 'call-spec' : function(){ }
<my-component @call_spec="callSpec"></my-component>
这里的 is_spec 包含“_”,对应的方法名称也应该是 call_spec : function(){ }5.4. 数据优先级
数据优先级由高到低为:组件调用传递 > 组件接收默认 > 组件内建
数据初始化优先级由高到低为:mounted > created > data
html
<div id="comp"><comp :a1="a1"></comp></div>
script
Vue.component('comp', {
props : {
a1 : {
default : 'props'
}
},
data : function(){
return {
a1 : 'data'
}
},
mounted : function(){
this.a1 = 'change on mounted';
},
created : function(){
this.a1 = 'change on created';
},
template : '<div>\{\{a1\}\}</div>'
});
new Vue({
el : '#comp',
data : {
a1 : 'pass'
}
});5.5. 组件事件
5.5.1. 子组件调用父组件方法
父组件通过在子组件上设置 @父组件方法="父组件方法" 传递方法给子组件, 子组件通过子组件方法里执行 this.$emit('父组件方法') 调用父组件方法
子组件
Vue.component('son', {
methods : {
call_fa_fun : function(){
this.$emit('fa_fun');
}
}
template : '<div>'+
' <a @click="call_fa_fun">call fa fun</a>'+
'</div>'
});父组件
Vue.component('fa', {
methods : {
fa_fun : function(){
alert('call from son');
}
}
template : '<div>'+
' <son @fa_fun="fa_fun"></son>'+
'</div>'
});html
<fa id="test"></fa>
javascript
new Vue({
el : '#test'
});5.5.2. 父组件调用子组件方法
子组件通过在自身设置 ref="子组件别名" 传递句柄给父组件, 父组件通过父组件方法里执行 this.$refs.子组件别名.子组件方法() 调用子组件方法
父组件
Vue.component('fa', {
methods : {
call_son_fun : function(){
this.$refs.son.son_fun();
}
}
template : '<div>'+
' <son ref="son"></son>'+
' <br />'+
' <a @click="call_son_fun">call son fun</a>'+
'</div>'
});子组件
Vue.component('son', {
methods : {
son_fun : function(){
alert('call from fa');
}
}
template : '<div>son</div>'
});html
<fa id="test"></fa>
javascript
new Vue({
el : '#test'
});5.5.3. 子组件之间相互调用方法
声明一个事件调度 var VueEventCtrlr = new Vue() 用来传递事件, 子组件A通过 mounted 函数里定义自定义函数 VueEventCtrlr.$on('自定义函数', function(){ ... }) 给子组件B使用, 子组件B通过 VueEventCtrlr.$emit('自定义函数', ...) 调用自定义函数
调度
var VueEventCtrlr = new Vue();
子组件A
Vue.component('a_com', {
data : function(){
return {
msg : ''
}
},
methods : {
call_b_fun : function(){
VueEventCtrlr.$emit('b_fun', this.msg);
}
},
template : '<div>'+
'输入:<input type="text" @keyup="call_b_fun" v-model="msg" />'+
'</div>'
});子组件B
Vue.component('b_com', {
data : function(){
return {
msg : ''
}
},
mounted : function(){
var ex = this;
VueEventCtrlr.$on('b_fun', function(d){
ex.msg = d;
});
},
template : '<div>打印:{{msg}}</div>'
});html
<div id="test"> <a_com></a_com> <b_com></b_com> </div>
javascript
new Vue({
el : '#test'
});5.6. 插槽
5.6.1. 规范
插槽使用 <slot name="xxx"></slot> 定义
插槽传值可以用 <template slot="xxx"></template>,也可以用 <div slot="xxx"></div> 这样的普通html标签
插槽不能跨级传递,也就是说“爷”组件只能向“子”组件传 slot 值,不能向“孙”组件传 slot 值