1.文本渲染
<template>
<div id="myapp">
<p v-text="hello"></p>
<p v-html="hello"></p>
<p>{{num+1}}</p>
{{status ? 'success' : 'fail'}}
</div>
</template>
<script>
export default {
data: function () {
return {
hello: '<span>你是猴子请来的逗比吗?</span>',
num: 1,
status: true
}
}
}
</script>
执行结果:
2.列表渲染 v-for 数组 对象 子组件
- v-for(数组)
<template>
<div id="myapp">
<!--普通-->
<ul>
<li v-for="item in list">
{{item.name}} - {{item.price}}
</li>
</ul>
<hr>
<!--v-text-->
<ul>
<li v-for="item in list" v-text="item.name + ' - ' + item.price"></li>
</ul>
<hr>
<!--带序号 并且给奇数行添加一个class=add-->
<ul>
<li v-for="(item,index) in list" :class="{add:index % 2}">
{{item.name}} - {{item.price}} - {{index}}
</li>
</ul>
</div>
</template>
<script>
export default {
data: function () {
return {
list: [
{
name: 'apple',
price: 34
},
{
name: 'banana',
price: 56
}
]
}
}
}
</script>
执行结果:
- v-for(对象) 获取key - value
<template>
<div id="myapp">
<!--v-for 对象-->
<!--只获取value-->
<ul>
<li v-for="value in objList">
{{value}}
</li>
</ul>
<!--获取key -value-->
<ul>
<li v-for="(value, key) in objList">
{{key}} - {{value}}
</li>
</ul>
</div>
</template>
<script>
export default {
data: function () {
return {
objList: {
name: 'apple',
price: 34,
color: 'red',
weight: 14
}
}
}
}
</script>
执行结果:
- v-for(子组件)
- 先创建一个
a
组件
- 代码
a.vue
代码如下:
- 先创建一个
<template>
<div class="hello">
{{ hello }}
</div>
</template>
<script>
export default {
data () {
return {
hello: 'I am componnet a'
}
}
}
</script>
在MyApp.vue
中调用
<template>
<div id="myapp">
<componentA v-for="(value, key) in objList"></componentA>
</div>
</template>
<script>
import componentA from './components/a.vue'
export default {
// 注册组件
components: {componentA},
data: function () {
return {
objList: {
name: 'apple',
price: 34,
color: 'red',
weight: 14
}
}
}
}
</script>
执行结果:
3. 列表数据的同步更新方法
数组的 push()
,pop()
,shift()
,unshift()
,splice()
,sort()
,reverse()
等都会触发列表的更新;
filter()
,concat()
,slice()
等不会触发列表的更新!
下面两种情形也不会触发列表数据更新
1.为数组的某一项赋值 vm.items[indexOfItem] = newValue
,
2.改变数组的长度 vm.items.length = newLength
也不会触发列表的更新!
要实现的效果:
代码:
<template>
<div id="myapp">
<ul>
<li v-for="item in list">
{{item.name + '-' + item.price}}
</li>
</ul>
<button v-on:click="addItem">addItem</button>
</div>
</template>
<script>
export default {
data: function () {
return {
list: [
{
name: 'apple',
price: 34
},
{
name: 'banana',
price: 56
}
]
}
},
methods: {
//点击按钮新增push触发列表数据的更新
addItem () {
this.list.push({
name: 'pinaapple',
price: 256
})
}
}
}
</script>
为数组的某一项赋值 vm.items[indexOfItem] = newValue
不会触发列表数据的更新,那么怎么才能让他更新数据呢? 用Vue
的set()
方法可以办到.
methods: {
addItem () {
// 把数组的第 1 个替换成新的值
Vue.set(this.list, 1, {
name: 'pinaapple',
price: 256
})
}
}
效果图:
4. vue标签属性和条件渲染
-
v-bind
事件绑定
正常写法
<a v-bind:href="link" v-bind:title="hello"></a>
简写
<a :href="link" :title="title">百度一下,你就上当</a>
代码示例
<template>
<div id="myapp">
<!--<a v-bind:href="link" v-bind:title="hello"></a>-->
<!--简写-->
<a :href="link" :title="title">百度一下,你就上当</a>
</div>
</template>
<script>
export default {
data: function () {
return {
link: 'https://wwww.baidu.com',
title: 'title : 百度一下,你就知道'
}
}
}
</script>
实现效果:
v-bind常用的用法,绑定class
<template>
<div id="myapp">
<a v-bind:class="classStr">百度一下,你就上当</a>
</div>
</template>
<script>
export default {
data: function () {
return {
classStr: 'red-font'
}
}
}
</script>
v-bind绑定的class和原来的class不冲突
<template>
<div id="myapp">
//class="link-href" v-bind:class="classStr"连个不存在冲突
<a class="link-href" v-bind:class="classStr">百度一下,你就上当</a>
</div>
</template>
<script>
export default {
data: function () {
return {
classStr: 'red-font'
}
}
}
</script>
v-bind绑定的class内容可以是一个对象
<template>
<div id="myapp">
//className为一个对象
<a class="link-href" v-bind:class="className">百度一下,你就上当</a>
</div>
</template>
<script>
export default {
data: function () {
return {
className: {
'red-font': false,
'blue-font': true
}
}
}
}
</script>
v-bind绑定的class内容可以是一个数组
<template>
<div id="myapp">
<a class="link-href" v-bind:class="className">百度一下,你就上当</a>
</div>
</template>
<script>
export default {
data: function () {
return {
className: ['red-font', 'big-font']
}
}
}
</script>
竟然还有这操作.....以下操作纯属高能!!!
<template>
<div id="myapp">
<a class="link-href" :class="[classA, classB]">百度一下,你就上当</a>
</div>
</template>
<script>
export default {
data: function () {
return {
classA: 'hello',
classB: 'word'
}
}
}
</script>
<template>
<div id="myapp">
<a class="link-href" :class="[classA, {'red-font': hasError}]">百度一下,你就上当</a>
</div>
</template>
<script>
export default {
data: function () {
return {
classA: 'hello',
hasError: true
}
}
}
</script>
v-bind通过内联样式改变style
<template>
<div id="myapp">
<a class="link-href" :style="linkClass">百度一下,你就上当</a>
</div>
</template>
<script>
export default {
data: function () {
return {
linkClass: {
'color': 'red',
'font-size': '20px'
}
}
}
}
</script>
- v-if 和 v-show
<template>
<div id="myapp">
<a v-if="isPartA">partA</a>
<a v-show="!isPartA">partB</a>
<button v-on:click="toggle">切换</button>
</div>
</template>
<script>
export default {
data: function () {
return {
isPartA: true
}
},
methods: {
toggle () {
this.isPartA = !this.isPartA
}
}
}
</script>
v-if和v-else也能实现上面👆的效果
<template>
<div id="myapp">
<a v-if="isPartA">partA</a>
<a v-else>no data</a>
<button v-on:click="toggle">切换</button>
</div>
</template>
<script>
export default {
data: function () {
return {
isPartA: true
}
},
methods: {
toggle () {
this.isPartA = !this.isPartA
}
}
}
</script>
5.事件绑定 - 内置事件绑定、自定义事件绑定
<button v-on:click="toggle">切换</button>
可以简写为
<button @click="toggle">切换</button>
-
内置事件绑定
阻止冒泡的事件
<button @click.stop="toggle">切换</button>
常用的事件修改器:keydown
-
@keydown
输入框输入内容或者内容更改都会触发执行
<input type="text" @keydown="onkeydown">
......
<script>
export default {
methods: {
onkeydown () {
console.log('on key down')
}
}
}
</script>
- 通过指定修改器
@keydown.enter
当敲击键盘enter
时触发执行
也可以采用keycode
: 如,@keydown.13
;获得相同的效果
<input @keydown.enter="onkeydown">
//这两个效果一样
<input @keydown.13="onkeydown">
......
<script>
export default {
methods: {
onkeydown () {
console.log('on key down')
}
}
}
</script>
-
自定义事件绑定
自定义事件绑定一般用在自定义组件上
在自定义组件a.vue
上代码如下
<template>
<div class="hello">
{{ hello }}
<button @click="emitMyEvent">emit</button>
</div>
</template>
<script>
export default {
data () {
return {
hello: 'I am componnet a'
}
},
methods: {
emitMyEvent () {
// 触发自定义事件 my-event 并传递一个参数 this.hello
this.$emit('my-event', this.hello)
}
}
}
</script>
在调用的组件中
<template>
<div id="myapp">
<!--在父组件中监听了 comA 的 my-event 事件 当触发的时候 我们执行了 onComaMyEvent -->
<comA @my-event="onComaMyEvent"></comA>
</div>
</template>
<script>
import comA from './components/a.vue'
export default {
components: {comA},
methods: {
// parmfromA为传递过来的参数
onComaMyEvent (parmfromA) {
console.log(parmfromA)
}
}
}
</script>
6.事件绑定-表单事件绑定
-
input
<template>
<div id="myapp">
<!--
input的事件绑定与普通的事件绑定的区别:
input是双向绑定
事件绑定采用v-model
-->
<input type="text" v-model="myVal">
<!--将表单的内容显示出来-->
{{myVal}}
</div>
</template>
<script>
import comA from './components/a.vue'
export default {
components: {comA},
data () {
return {
myVal: ''
}
}
}
</script>
修饰符:.lazy
当敲击键盘enter
时,数据才会更新
<input type="text" v-model.lazy="myVal">
......
其他修饰符
.number
- 输入字符串转为数字,如果不加.number
.trim
- 输入首尾空格过滤
-
intput - checkbox 复选框 多选
还是用v-model
绑定,设定都指向myVal
,myVal
要设为一个数组,数组里面插进去的值,是从input
的value
中获取的.
<template>
<div id="myapp">
{{myVal}}
<br>
<!--多选-->
<input type="checkbox" name="" value="apple" v-model="myVal">
<label >apple</label>
<input type="checkbox" name="" value="banana" v-model="myVal">
<label >apple</label>
<input type="checkbox" name="" value="orange" v-model="myVal">
<label >apple</label>
</div>
</template>
<script>
import comA from './components/a.vue'
export default {
components: {comA},
data () {
return {
myVal: []
}
}
}
</script>
-
intput - radio 单选
<template>
<div id="myapp">
{{myVal}}
<br>
<!--select-->
<!--
为什么默认选种是空的?
刚开始时,myVal是空的,因为是双向绑定,option里面是没有当前的myVal,所以在这个组件里面是没有被选中的.如果把myVal刚开始设为0 (myVal: '0'),则开始默认为apple.
-->
<select name="" id="" v-model="myVal">
<option v-for="item in options" :value="item.value">{{ item.name }}</option>
</select>
</div>
</template>
<script>
import comA from './components/a.vue'
export default {
components: {comA},
data () {
return {
// 默认值为0,如果设为''空的话,初始化没有默认选种
myVal: '0',
options: [
{
name: 'apple',
value: '0'
},
{
name: 'banana',
value: '1'
},
{
name: 'orange',
value: '2'
}
]
}
}
}
</script>
7 计算属性和数据监听
- 计算属性 computed
需求:把表单输入的内容中,将数字替换掉
<template>
<div id="myapp">
{{myValueWithoutNum}}
<br>
<input type="text" v-model="myValue">
</div>
</template>
<script>
export default {
data () {
return {
myValue: ''
}
},
// 计算属性
computed: {
myValueWithoutNum () {
// 把输入的数字替换为空
return this.myValue.replace(/\d/g, '')
}
}
}
</script>
以上效果👆可以通过
meyhods
调用方法 实现
<template>
<div id="myapp">
<!--{{myValueWithoutNum}}-->
{{ getMyValueWithoutNum() }}
<br>
<input type="text" v-model="myValue">
</div>
</template>
<!--
这两种方式实现了同样的效果,
那么这两种方式有什么不同呢?
答:一个是通过方法来调用,还有一个是通过计算属性,区别在于计算属性他的更新只会根据myValue来进行更新,如果myValue不再更新,那么计算属性也停止更新;而我们调用 getMyValueWithoutNum()方法时,无论什么时候调用,这个值都会重新去获取myValue进行处理!
-->
<script>
export default {
data () {
return {
myValue: ''
}
},
// 计算属性
computed: {
myValueWithoutNum () {
// 把输入的数字替换为空
return this.myValue.replace(/\d/g, '')
}
},
// 调用方法
methods: {
getMyValueWithoutNum () {
// 把输入的数字替换为空
return this.myValue.replace(/\d/g, '')
}
}
}
</script>
这两种方式实现了同样的效果,那么这两种方式有什么不同呢?
答:一个是通过方法来调用,还有一个是通过计算属性,区别在于计算属性他的更新只会根据myValue来进行更新,如果myValue不再更新,那么计算属性也停止更新;而我们调用 getMyValueWithoutNum()方法时,无论什么时候调用,这个值都会重新去获取myValue进行处理!
- 属性监听 watch
<template>
<div id="myapp">
<input type="text" v-model="myValue">
</div>
</template>
<script>
export default {
data () {
return {
myValue: ''
}
},
//监听myValue属性
watch: {
myValue: function (val, oldVal) {
console.log(val, oldVal)
}
}
}
</script>