文章目录
VUE
快速入门
CDN方式引入VUE
min时生产模式
- https://cdn.staticfile.org/vue/2.2.2/vue.min.js
- https://unpkg.com/vue/dist/vue.js
- https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.8/vue.min.js
- https://cdn.jsdelivr.net/npm/vue/dist/vue.js
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.8/vue.min.js"></script>
创建vue实例
<body>
<div id="app">{{message}}</div>
<div >{{message}}</div>
</body>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script>
var vm = new Vue({
el: "#app"
data(){
return{
message: "我的世界"
}
}
})
</script>
el:属性表示 Vue实例挂在的节点,该属性值可以是一个 CSS 选择器,也可是HTMLElement
7-11行 创建了一个vue实例
第2行 定义 id为app 的DOM元素,所以会显示 我的世界
第3行 未给定id 的元素不会被 Vue影响到 {{message}}
属性
data属性表示Vue 实例中的数据,data接收一个Object或者返回一个对象数据的函数Function,当Vue实例被创建时,会把data中的所有属性加入到Vue到响应式系统中,这些属发生改变时,视图也会同时更新
常用指令
Vue 指令是带有 v- 前缀的特殊 attribute,它的值是一个表达式,指令帮助我们操作 DOM,当表达式的值发生改变时更新渲染 DOM
指令 | 作用 | 其他说明 |
---|---|---|
v-text | {{}}一样用于数据绑定 | 是元素InnerText属性 |
v-html | 绑定一段html标签 | 是元素innerHTML |
v-bind | 给元素属性赋值 v-bind:属性名=变量名 | 例如:v-bind:name=“message” |
v-for | 列表循环渲染 v-for=“item in data” | data可以是数组或者对象 |
— | ||
v-if | 添加删除DOM元素 | true,false |
v-show | 显示英寸HTML标签 | true,false |
— | ||
v-if | v-else-if | v-else |
v-on | 用于绑定事件 v-on:事件=“方法” | v-on:click=“alert” |
v-model | 实现数据双向绑定 | |
v-pre | 跳过所在元素和它子元素的编译过程 | |
v-once | 模版在第一次更新时显示数据,此后根须DOM应用数据时,内容不会更新 |
v-text
使用了 v-text 指令,它绑定 message 值,会将 message 的值动态插入 <div>
标签内。
<body>
<div id="app">
<div v-text="message"></div>
</div>
</body>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script>
var vm = new Vue({
el: '#app',
data: {
message: "Hello!"
},
})
</script>
v-html
使用了 v-html 指令,它绑定 message 值,会将 html 元素插入 <div>
标签内。
<body>
<div id="app">
<div v-html="message"></div>
</div>
</body>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script>
var vm = new Vue({
el: '#app',
data: {
message: "<div>您好,我是小慕!</div>",
}
})
</script>
v-bind
v-bind:title="message"
vue
还提供了指令 v-bind
的简写方式,可以直接通过:属性名
的方式。
<body>
<div id="app">
<div>
<img v-bind:src="src"/>
</div>
<div>
<button :disabled="disabled">禁用按钮</button>
</div>
</div>
</body>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script type="text/javascript">
var vm = new Vue({
el: '#app',
data: {
src: 'www.baidu.com',
disabled: true
}
})
</script>
v-for
v-for = “item in data”
v-for="(item,index) in data"
- data 需要遍历的数组元素
- item: 循环变量( 当次元素的变量 例如:item.name, item.age)
- index: 数组脚标
渲染数组
使用 v-for 对数组进行遍历,循环输出<li></li>
,并在每次循环的时候将 name 插入到 <li>
标签内。
<body>
<div id="app">
<ul>
<li v-for="item in arr">{{item.name}}</li>
</ul>
</div>
</body>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script type="text/javascript">
var vm = new Vue({
el: '#app',
data() {
return {
// 要循环的数组
arr: [
{ name: '青花瓷' },
{ name: '阳光总在风雨后' },
{ name: '十年' }
]
}
}
})
</script>
对象渲染
对数组进行循环的时候,item 表示对象中某一属性的值:
<div id="app">
<ul>
<li v-for="item in obj">{{item}}</li>
</ul>
</div>
</body>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<script type="text/javascript">
var vm = new Vue({
el: '#app',
data() {
return{
obj:{ name: '微笑',
age: '18',
sex: '男',
}
}
}
})
</script>
v-if 、v-show
通过设置v-if,v-show
的true,或false 来在页面中显示或者隐藏标签
v-if
:根据表达式值在DOM中生成或移除一个元素
v-show
:根据表达式的值通过样式的改变来显示或隐藏HTML元素
<div>
<button>按钮</button>
</div>
<div>
<button id="show" v-show="delectB" >删除,控制v-show显隐</button><br>
<button v-on:click="delectB = true">显示</button>
<button v-on:click="delectB = false ">删除</button>
</div>
</div>
</body>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<script type="text/javascript">
var vm = new Vue({
el: '#app',
data() {
return {
delectB: true
}
}
})
</script>
v-if 、v-else、v-else-if
Number 的值来判断对应的语句
<div id="app">
<div v-if="number === 1">
A
</div>
<div v-else-if="number === 2">
B
</div>
<div v-else>
C
</div>
</div>
v-on
对应 DOM Event对象
要给元素绑定事件,
vue
中提供了指令v-on
来进行事件的绑定。用法:v-on:事件名="方法"
,例如:v-on:click=“alert”
属性 | 事件 |
---|---|
onabort | 图像的加载被中断。 |
onblur | 元素失去焦点。 |
onchange | 域的内容被改变。 |
onclick | 当用户点击某个对象时调用的事件 |
ondblclick | 当用户双击某个对象时调用的事件 |
onerror | 在加载文档或图像时发生错误。 |
onfocus | 元素获得焦点。 |
onkeydown | 某个键盘按键被按下。 |
onkeypress | 某个键盘按键被按下并松开 |
onkeyup | 某个键盘按键被松开。 |
onload | 一张页面或一幅图像完成加载。 |
onmousedown | 鼠标按钮被按下。 |
onmousemove | 鼠标被移动。 |
onmouseout | 鼠标从某元素移开。 |
onmouseover | 鼠标移到某元素之上。 |
onmouseup | 鼠标按键被松开。 |
onreset | 重置按钮被点击。 |
onresize | 窗口或框架被重新调整大小。 |
onselect | 文本被选中 |
onsubmit | 确认按钮被点击。 |
onunload | 用户退出页面。 |
v-model
通过v-model
age变动动时,input中的也会修改
<div id="app">
<input v-model="age"/>
<div>{{age}}</div>
<button @click="add">age+1</button>
</div>
</body>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<script type="text/javascript">
var vm = new Vue({
el: '#app',
data: { age: 10 },
methods: {
add(){this.age = this.age + 1;}
}
})
</script>
v-pre
3行使用 v-pre 不会被vue 解析 输出 {{age}}
4行正常输出 10
<body>
<div id="app">
<div v-pre>当前输入的年龄是: {{age}}</div>
<div>当前输入的年龄是: {{age}}</div>
</div>
</body>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script type="text/javascript">
var vm = new Vue({
el: '#app',
data: {
age: 10
},
})
</script>
v-once
*页面加载完成后,此行标签不会收到 动态影响 age显示最初的赋值
<div v-once>当前输入的年龄是: {{age}}</div>
计算属性 computed
如果在模版中编写计算
{{v1 * v2}}
大量编写会让模版复杂使用
computed
可以解决此类问题,computed必须有返回值
computed
和methods
区别:计算属性基于它**依赖的缓存**,计算属性的改变取决于它依赖的数据的变化,值要依赖的数据不发生改变,计算属性就不会更新。而使用methods
每次都会重新计算一边,会有一定的性能消耗。
<body>
<div id="app">
<h1>value1:{{v1}}</h1>
<h1>value2:{{v2}}</h1>
<h1>结果:{{ride}}</h1>
</div>
</body>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<script type="text/javascript">
var vm = new Vue({
el: '#app',
data:{
v1: 3,
v2: 10
},
//计算属性
computed: {
ride() {
return this.v1*this.v2;
}
}
})
</script>
计算属性会随者
v1或v2
的改变重新渲染到页面上
getter/setter
每一个计算属性都包含一个 getter和一个setter
- getter:来读取
- setter:当修改计算属性都值就会触发
setter
函数,执行自定义操作
<body>
<div id="app">
<h1>字符1{{name1}}</h1>
<h1>字符2{{name2}}</h1>
<h1>计算结果{{str}}</h1>
</div>
</body>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<script type="text/javascript">
var vm = new Vue({
el: '#app',
data:{
name1: "天",
name2: "我"
},
methods: {
},
//计算属性
computed: {
str:{
get: function () {return this.name1+"-"+this.name2},
set: function(newVlaue){
console.log(newVlaue)
var s = newVlaue.split("-")
this.name1=s[0]
this.name2=s[s.length-1]
}
}
}
})
</script>
监听器 watch
watch
实际是vue实例的一个对象属性,当我们需要对vue实例上某个属性进行监听时,需要以监听的属性名作为watch
对象的键,一个函数fucntion
作为该键的值。函数接收两个参数newValue
和oldValue
变化的值,和原先的值
var vm = new Vue({
el: '#app',
data() {
return {
count: 0
}
},
watch: {
count: function(newVal, oldVal) {
// 具体处理逻辑
},
}
})
//例子
<body>
<div id="app">
<input v-model="count">
<button v-on:click="cut">减1</button>
<button v-on:click="add">加1</button>
</div>
</body>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<script type="text/javascript">
var vm = new Vue({
el: '#app',
data: {
count: 0,
},
methods: {
cut() {this.count = this.count-1;},
add() {this.count = this.count+1;}
},
//监听
watch: {
count:function(newVal,oldVal){
if(newVal > 10) this.count = 3;
if(newVal < 0 ) this.count = 5;
}
}
})
</script>
对象的监听
'对象.属性'
的方式来监听值的变化
<body>
<div id="app">
<input v-model="p.name">
</div>
</body>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<script type="text/javascript">
var vm = new Vue({
el: '#app',
data: {
p:{ name: "我" }
},
methods: {},
//监听
watch: {
'p.name' :function (newVal,odlVal) {
console.log(newVal , odlVal)
}
},
})
</script>
immediate 绑定时触发一次
给监听器一个
immediate
属性,设置为ture,编写handler
函数,在页面渲染的时候就会触发handler
函数
<div id="app">
<input v-model="p.name">
</div>
</body>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<script type="text/javascript">
var vm = new Vue({
el: '#app',
data: {
p:{ name: "我" }
},
methods: {},
//监听
watch: {
'p.name': {
handler(newVal,oldVal){ console.log(newVal) },
immediate: true//在渲染页面时运行 handler方法
}
},
})
</script>
handler 函数
当watch监听到数据变动时默认就是调用
handler
函数
deep 深度监听
添加
deep
属性设置 true 能进行深入观察,监听器会一层层的往下遍历,给对象所有属性都加上这个监听器,修改里面任何一个属性都会触发这个监听器里的handler
dd1
<body>
<div id="app">
<input v-model="p.name">
<input v-model="p.age">
</div>
</body>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<script type="text/javascript">
var vm = new Vue({
el: '#app',
data: {
p:{
name: "我",
age: 19
}
},
//监听
watch: {
p:{
handler(newVal, oldVal) {
console.log(newVal)
},
deep: true
}
},
})
</script>
事件处理
在
uve
中除了methods
的事件绑定以外还可以使用原生的DOM
$传入
<button v-on:click="setCount(10, $event)"> 设置为 10 个 </button>
methods: {
setCount(count, event) {
this.count = count
console.log(event)
}
}
事件修饰符
event.preventDefault(): 用来取消事件的默认动作
event.stopPropagation(); 用来阻止事件冒泡到父元素,阻止任何事件处理程序被执行
Vue提供了以下事件修饰符:
- stop:阻止单机事件继续传播
- prevent: 只有修饰符,提交事件不在重载页面
- captrue: 添加事件监听器时使用事件捕获模式,即使元素自身触发的事件现在自身处理,然后交由内部元素进行处理
- self: 只有在event.target时当前元素自身时触发 处理函数,即事件不是从内部元素触发的;
- once:点击事件将只触发一次
- pasive:滚动事件立即触发,不会等待其他串联事件,即prevent会失效
<!-- 阻止单击事件继续传播 -->
<a v-on:click.stop="doThis"></a>
<!-- 提交事件不再重载页面 -->
<form v-on:submit.prevent="onSubmit"></form>
<!-- 修饰符可以串联 -->
<a v-on:click.stop.prevent="doThat"></a>
<!-- 添加事件监听器时使用事件捕获模式 -->
<!-- 即内部元素触发的事件先在此处理,然后才交由内部元素进行处理 -->
<div v-on:click.capture="doThis">...</div>
<!-- 只当在 event.target 是当前元素自身时触发处理函数 -->
<!-- 即事件不是从内部元素触发的 -->
<div v-on:click.self="doThat">...</div>
<!-- 点击事件将只会触发一次 -->
<a v-on:click.once="doThis"></a>
数据双向绑定2
复选框
<div>
<input type="checkbox" id="food" value="食品" v-model="types">
<label for="food">食品</label>
<input type="checkbox" id="book" value="图书" v-model="types">
<label for="book">图书</label>
<input type="checkbox" id="clothes" value="衣服" v-model="types">
<label for="clothes">衣服</label>
</div>
data: {
types: []
},
下拉框
<select v-model="company">
<option value="">请选择</option>
<option>顺丰</option>
<option>中通</option>
<option>圆通</option>
</select>
data: {
company: ''
},
number 、trim
//用户输入改为数值类
<input v-model.number="age" type="number">
//过滤前后空白
<input v-model.trim="str">
底部
使用文本版本不一样这里是bug