Vue学习笔记之基础
Vue学习笔记
1、helloworld样例
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 示例</title>
</head>
<body>
<div id="app">
<input type="text" v-model="name" placeholder="你的名字">
<h1>你好, {{name}}</h1>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
var myData = {
name : '',
a : 2
}
var app = new Vue({
el:'#app',
data:myData,
created:function () {
console.log(this.a)
},
mounted: function () {
console.log(this.$el)
}
})
</script>
</body>
</html>
显示效果:
Vue生命周期钩子:
- created:实例创建完成后调用,此阶段完成了数据的观测等,但尚未挂载,$el还不可用。需要初始化处理一些数据时会比较有用。
- mouted:el挂载到实例上后调用,一般我们的第一个业务逻辑会在这里开始
- beforeDestroy:实例销毁之前调用,主要解绑一些使用addEventListener监听的事件等。
2、指令
指令 | 说明 |
v-html | 用于输出html,不是将数据解析后的纯文本 |
v-pre | 用于跳过这个元素和它的子元素的编译过程,如想显示{{}}标签不进行替换 |
v-if,v-else-if, v-else | 条件指令 |
v-model | 实现表单输入和应用状态之间的双向绑定 |
v-bind(省略形式为:) | 动态更新html元素上的属性 |
v-on(省略形式为@) | 用于绑定事件监听器。表达式可以是一个方法名,这些方法可以写在Vue实例的methods属性内,并且是函数的形式,函数内的this指向的是当前Vue实例本身。也可以是一个内联语句。 |
v-once | 一个不需要表达式的指令,作用是定义它的元素或组件只渲染一次,包括元素或组件的所有子节点。首次渲染后,不再随数据的变化重新渲染,将被视为静态内容 |
v-show | 是改变元素的css属性display。当v-show表达式的值为false时,元素会隐藏。不能在<template>中使用 |
v-for | 用于循环遍历数组或者对象,需要结合in来使用,类似item in items的形式。也支持一个可选参数作为当前项的索引。可以用在内置标签<template>上。 |
v-if,v-else-if,v-else如果一次判断的是多个元素,可以在Vue.js内置的元素上使用条件指令,最终渲染的结果不包含该元素。如
<template v-if="status === 1">
<p>这是一段文本</p>
<p>这是一段文本</p>
<p>这是一段文本</p>
</template>
v-model使用在单选按钮时,可以不需要v-model,直接使用v-bind绑定一个布尔类型的值,为真时选中,为否是不选中。如果是应用在组合情况下,需要v-model配合value来使用。
<br>
<input type="radio" v-model="picked2" value="html" id="html">
<label for="html">HTML</label>
<br>
<input type="radio" v-model="picked2" value="js" id="js">
<label for="js">JavaScript</label>
<br>
<input type="radio" v-model="picked2" value="css" id="css">
<label for="css">CSS</label>
<br>
<p>选择的项是: {{picked2}}</p>
显示效果为:
v-model应用在复选框上也分单独使用和组合使用,单独使用时,也是有v-model来绑定一个布尔值。组合使用时,v-model与value一起,多个勾选框绑定到同一个数组类型的数据。
<br>
<br>
<input type="checkbox" v-model="checked2" value="html" id = "html">
<label for="html">HTML</label>
<br>
<input type="checkbox" v-model="checked2" value="js" id = "js">
<label for="js">JavaScript</label>
<br>
<input type="checkbox" v-model="checked2" value="css" id = "css">
<label for="css">CSS</label>
<br>
<p>选择的项是: {{checked2}}</p>
显示效果为
v-model用于选择列表时,也分为单选 和多选两种方式。单选情况为
<br>
<br>
<select v-model="selected">
<option>html</option>
<option value="js">JavaScript</option>
<option>css</option>
</select>
<p>选择的项是:{{selected}}</p>
显示效果为
<option>是备选项,如果有value属性,v-model会优先匹配value的值,如果没有,会直接匹配<option>的text。
给<select>添加属性multiple就可以多选了,此时v-model绑定的是一个数组。
显示效果为
在使用v-model与value配合使用时,如果value是动态值,则需要用v-bind来实现,即 :value来指定动态值
3、过滤器
在{{}}插值的尾部添加一个管道"|"对数据进行过滤。过滤规则是自定义的,通过给Vue实例添加选项filters来设置。
过滤器也支持串联,而且可以接收参数。如{{message | filterA | filterB}},{{message | filterA('arg1', 'arg2')}}
4、计算属性
模板内的表达式常用于简单的运算,当过长或者逻辑复杂时,计算属性用于解决此问题的。
所有的计算属性都以函数的形式写在Vue实例内的computed选项内,最终返回计算后的结果。每一个计算属性都包含一个getter和一个setter。当计算属性是函数属性时,表示的是getter。绝大多情况下,只会用默认的getter方法来读取一个计算属性,在业务中很不使用setter。
计算属性可以依赖其它计算属性,也可以依赖当前Vue实例的数据,还可以依赖其他实例的数据。
计算属性是基于它的依赖缓存的,一个计算属性所依赖的数据发生变化时,它才会重新计算。
5、购物车样例
index.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>购物车示例</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<div id="app" v-cloak>
<template v-if="list.length">
<table>
<thead>
<tr>
<th></th>
<th>商品名称</th>
<th>商品单价</th>
<th>购买数量</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr v-for="(item, index) in list">
<td> {{ index + 1}}</td>
<td> {{ item.name }}</td>
<td> {{ item.price }}</td>
<td>
<button @click="handleReduce(index)" :disabled="item.count === 1">-</button>
{{item.count}}
<button @click="handleAdd(index)">+</button>
</td>
<td>
<button @click="handleRemove(index)">移除</button>
</td>
</tr>
</tbody>
</table>
<div>总价:¥ {{ totalPrice }}</div>
</template>
<div v-else>购物车为空</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script src="index.js"></script>
</body>
</html>
index.js文件
var app = new Vue({
el : '#app',
data : {
list : [
{
id : 1,
name : 'iPhone 7',
price : 6188,
count : 1
},
{
id : 2,
name : 'iPad Pro',
price : 5888,
count : 1
},
{
id : 3,
name : 'MacBook Pro',
price : 21488,
count : 1
}
]
},
computed : {
totalPrice : function() {
let total = 0;
for (let i = 0; i < this.list.length; i++) {
let item = this.list[i];
total += item.price * item.count;
}
return total.toString().replace(/\B(?=(\d{3})+$)/g, ',')
}
},
methods : {
handleReduce : function(index) {
if (this.list[index].count === 1) return;
this.list[index].count--;
},
handleAdd : function(index) {
this.list[index].count++;
},
handleRemove : function(index) {
this.list.splice(index, 1);
}
}
})
style.css文件
[v-cloak] {
display : none
}
table {
border : 1px solid #e9e9e9;
border-collapse : collapse;
border-spacing : 0;
empty-cells : show;
}
th, td {
padding : 8px 16px;
border : 1px solid #e9e9e9;
text-align : left;
}
th {
background: #f7f7f7;
color: #5c6b77;
font-weight: 600;
white-space: nowrap;
}
显示效果
6、组件
组件注册分为全局注册和局部注册
全局注册通过Vue.component('my-component', options)
局部注册使用Vue实例中的components选项,注册后的组件只有在该实例作用域下有效。组件中也可以使用components选项来注册组件,使组件可以嵌套。
除了template选项外,也可以有其它选项,如data,computed,methods等,但是在使用data时,必须是函数。
6.1 组件通信
父组件->子组件:通过props
子组件->父组件:子组件用$emit来触发事件,父组件用$on来监听子组件事件。父组件也可以直接在子组件的自定义标签使用v-on来监听子组件触发的自定义事件。代码例子如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<p>总数: {{total}}</p>
<my-component @increase="handleGetTotal" @reduce="handleGetTotal"></my-component>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
Vue.component('my-component', {
template: '\
<div>\
<button @click="handleIncrease">+1</button>\
<button @click="handleReduce">-1</button>\
</div>',
data: function () {
return {
counter : 0
}
},
methods: {
handleIncrease : function () {
this.counter++;
this.$emit('increase', this.counter);
},
handleReduce : function () {
this.counter--;
this.$emit('reduce', this.counter);
}
}
});
var app = new Vue({
el: '#app',
data : {
total : 1
},
methods : {
handleGetTotal : function(total) {
this.total = total;
}
}
})
</script>
</body>
</html>
非父子组件通信 :即兄弟组件和跨多级组件。一种是通过创建空Vue实例,来发送和接收消息。
例子如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<p>消息:{{message}}</p>
<my-component></my-component>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
var bus = new Vue();
Vue.component('my-component', {
template: '\
<div>\
<button @click="handleEvent">+1</button>\
</div>',
methods: {
handleEvent : function () {
bus.$emit('on-message', '来自组件my-component的事件');
}
}
});
var app = new Vue({
el: '#app',
data : {
message : ''
},
mounted : function () {
var _this = this;
bus.$on('on-message', function (msg) {
console.log(msg)
_this.message = msg;
})
}
})
</script>
</body>
</html>
或者通过$parent来达到子组件到父组件的传递
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
{{message}}
<component-a></component-a>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
Vue.component('component-a', {
template: '\
<button @click="handleEvent">通过父链直接修改数据</button>\
',
methods: {
handleEvent : function () {
this.$parent.message = '来自组件component-a的内容';
}
}
});
var app = new Vue({
el: '#app',
data : {
message : ''
},
})
</script>
</body>
</html>
$children达到父组件到子组件的传递,由于子节点可能有很多,可以使用$refs.name来访问子节点
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<button @click="handleRef">通过ref获取子组件实例</button>
<component-a ref="comA"></component-a>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
Vue.component('component-a', {
template: '\
<div>子组件 {{message}}</div>\
',
data: function () {
return {
message : '子组件内容'
}
}
});
var app = new Vue({
el: '#app',
methods : {
handleRef : function () {
this.$refs.comA.message = 'abc';
}
}
})
</script>
</body>
</html>
参考资料:
《Vue实战》
更多推荐
所有评论(0)