目录
动态绑定样式(对v-bind的补充):
通过class
使用变量或者表达式的形式
2.对象形式
3.数组形式
通过style
1.变量或者表达式
2.对象形式
3.数组形式
动态绑定样式(对v-bind
的补充):
<style> .change{ color:red } </style>
<span :class="change">Hello Vue! <span> //这里使用到v-bind,绑定了Vue中的change变量
data:{ change:'change' }
<style> .mycolor{ color:red } </style>
<span :class="{mycolor:isshow}">Hello Vue! <span> //前者是上面的ClassName 后者是Vue中的变量
data:{ isShow:true }
<span :class="[变量1,变量2,变量3]">Hello Vue! <span>
data:{ 变量1:'', 变量2:'', 变量3:'' }
<span :style="myStyle">Hello Vue! <span> <span :style="JS表达式">Hello Vue! <span>
<span :style-"{color:mycolor}">Hello Vue! <span> data:{ mycolor:'red' }
<span :style-"[myStyle1,myStyle2]">Hello Vue! <span> data:{ mystyle1:{ color:red; }, mystyle:{ font-size:24px } }
注意:我们常用的是class
的前两种方法,数组形式的用的少
$event是指当前触发的是什么事件(鼠标事件,键盘事件等)
$event.target则指的是事件触发的目标,即哪一个元素触发了事件,这将直接获取该dom元素
下面是例子:
<button @click="console.log($event)" name="哈哈">单击</button>
由于鼠标点击,所以触发鼠标单击事件,打印出来的是事件,如下图:
实际上展开target就可以看到更具体的信息,这里不做演示,其实也就是这个button的各种属性等等,直接就是这dom元素。
且看下面这段代码,直接打印出target:
<button @click="console.log($event.target)" name="哈哈">单击</button>
可见打印出来的值就是这个元素本身
我们可尝试获取其属性值
<button @click="console.log($event.target.name)" name="哈哈">单击</button>
在JavaScript事件中除了前面所说的事件,还有键盘事件,也经常需要监测常见的键值。在Vue中允许v-on
在监听键盘事件时添加关键修饰符。记住所有的keyCode
比较困难,所以Vue为最常用的键盘事件提供了别名:
.enter
:回车键.tab
:制表键.delete
:含delete
和backspace
键.esc
:返回键.space
: 空格键.up
:向上键.down
:向下键.left
:向左键.right
:向右键stop
阻止冒泡
self
只有点击自身才执行
stop.self
组合只有点击自身并且阻止冒泡了
capture
将后面的函数转换为捕获阶段的函数
prevent
阻止默认事件常用在a标签和form表单上
关于插值语法
问题的提出
先看如下代码:
<body> <div id="app"> <span>{{user.name}}</span> <button @click="change">变换名字</button> </div> </body> <script src="../node_modules/vue/dist/vue.js"></script> <script> const app=new Vue({ el:'#app', data:{ user:{ } }, methods: { change(){ this.user.name='小王' } }, }) </script>
代码的意图是通过插值语法显示user里面的name不过我们会发现,当我们点击按钮的时候并不会出现任何反应。不过我们打开Vue或者是打印app都可以发现name属性已经更改完成。
data:{ user:{ name:'' } }
2.直接修改user数据
methods: { change(){ this.user={ name:'小王' } }
3.this.$set
this.$set(this.user,'name',"小明")
z4.$forceUpdate()强制更新 不过这种方案没有让name变成响应式数据
this.user.name="小明" this.$forceUpdate()
<body> <div id="app"> <ul> <li v-for="item in list">{{item}}</li> </ul> <button @click="change">改变数组</button> </div> </body> <script src="../node_modules/vue/dist/vue.js"></script> <script> const app = new Vue({ el: '#app', data: { list: [1, 2, 3, 4] }, methods:{ change(){ this.list[0]=111 } } }) </script>
我们出现了同样的问题,在Vue插件和查看代码中发现了list的变化,但是浏览器的显示没有任何变化。那么我们怎么去解决这个问题呢?
1.$set 最佳方案
this.$set(this.list,0,666)
2.$forceUpdate() 强制更新,不推荐使用
this.$forceYpdate()
3.push 和pop
push方法已经经过Vue重写了,另外经常使用的方法也改写过了
4.直接替换数组内容,重写list
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <!-- 最新版本的 Bootstrap 核心 CSS 文件 --> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous"> </head> <body> <div id="app"> <form style="width: 500px;margin:0 auto"> 书名:<input type="text" v-model="book.name"> <br> 价格:<input type="text" v-model="book.price"> <br> <button type="button" class="btn btn-default" @click.prevent="addBook">添加</button> </form> <table class="table table-bordered" style="width: 800px;margin:50px auto;"> <thead> <tr> <th> id </th> <th> 书名 </th> <th> 价格 </th> <th>数量</th> <th> 操作 </th> </tr> </thead> <tbody> <tr v-for="(book, index) in bookList"> <td>{{book.id}}</td> <td>{{book.name}}</td> <td>{{book.price}}</td> <td> <input type="number" v-model.number="book.num"> </td> <td> <button class="btn btn-danger" @click="delBook(book.id)">删除</button> </td> </tr> <tr> <td colspan="5"> 总价: {{total()}} </td> </tr> </tbody> </table> </div> <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.14/vue.js"></script> <script> const app = new Vue({ el:'#app', methods: { addBook() { console.log("999") this.bookList.push({ id: this.bookList.length+1, name: this.book.name, price: this.book.price, num: 1 }) }, total() { return this.bookList.reduce((total, item)=> { total += item.price * item.num return total }, 0) }, delBook(id) { this.bookList = this.bookList.filter(item=>item.id !== id) } }, data: { book: { }, bookList: [ { id: 1, name: 'Javascript 权威指南', price: 20, num: 1 }, { id: 2, name: 'Javascript 从入门到放弃', price: 29.99, num: 1 }, { id: 3, name: 'Vue 从入门到放弃', price: 28, num: 1 }, { id: 4, name: 'uniapp 从入门到放弃', price: 24, num: 1 } ] } }) </script> </body> </html>
看完文章就抓紧多练习几遍,趁热打铁,希望能在学习的道路上为你们贡献份力量!!!