正确的开始,微笑的进步,然后持续
文章目录
- class和Style绑定
- v-bind绑定class
- v-bind绑定style
- 指令
- v-model指令
- v-clock指令
- v-once指令
- 自定义指令
- 功能
- 过滤器
- 操作dom
- 计算属性
class和Style绑定
v-bind绑定class
- 绑定数据对象
<div id="app"><!-- 写死: :class="{类名:是否加入这类名,类名1:是否加入这个类名1}" --><div :class="{bg:true,red:true}">盒子</div> <br /><!-- 动态: 需要把对象声明在data中,将来操作数据即可操作类名 --><div :class="classObject">盒子</div> <br /><button @click="classObject.bg=true">加bg类</button><button @click="classObject.red=true">加red类</button> </div> <script src="./vue.js"></script> <script>const vm = new Vue({el: '#app',data: {classObject: {bg: false,red: false}}}) </script>
- 绑定数组数据
<div id="app"><!-- 写死 :class="['类名','类名1']" --><div :class="['bg','red']">我是div标签</div> <br /><!-- 动态 需要把数组声明放到data中,操作数组即操作类名即可 --><div :class="classArray">管你什么想法</div> <br /><button @click="classArray.push('bg')">加bg类</button><button @click="classArray.push('red')">加red类</button> </div> <script src="./vue.js"></script> <script>const cm = new Vue({el: '#app',data: {classArray: []}}) </script>
- 总结
:class
可以使用对象 {类名:布尔类型}:class
可以使用数组 [‘类名’]class
和:class
可以共存,结果类合并在一起
v-bind绑定style
- 绑定对象类型
<div id="app"> <!-- 写死 :style="{css属性名称:css属性值}" 注意:属性名要用驼峰命名法 反之,则需要引号包起来 --> <div :style="{color:'pink',fontSize:'26px'}">小甜甜加油哦</div> <br /> <!-- 动态 需要把对象声明在data中 --> <div :style="styleObject">愿有一人陪你跌沛琉璃</div> <br /> <button @click="styleObject.color='green'">变色</button> <button @click="styleObject.fontSize='30px'">变大</button> </div> <script src="./vue.js"></script> <script> const vm = new Vue({el: '#app',data: {// 注意:响应式数据(驱动视图更新的数据),必须提前在data中显性的声明styleObject: {color: null,fontSize: null}} }) </script>
- 绑定数组类型
<div id="app"> <!-- 写死 :style="[{css属性名称:css属性值,...},{},{}...]" --> <div :style="[{color:'red',fontSize:'26px'}]">我还是从前那个少年</div> <br /> <!-- 动态 需要将数组声明在data中 --> <div :style="styleArray">没有一丝丝改变</div> <br /> <button @click="styleArray.push({color:'orange'})">变色</button> <button @click="styleArray.push({fontSize:'30px'})">变大</button> </div> <script src="./vue.js"></script> <script> const vm = new Vue({el: '#app',data: {// 需要追加的选项 {color:'orange'},{fontSize:'30px'}styleArray: []} }) </script>
- 总结
:style
可以使用对象 {css属性名:css属性值}:style
可以使用数组 [css属性名:css属性值]- 如果同时存在
style
和:style
,vue操作的样式会覆盖默认样式
指令
v-model指令
- 作用:给表单元素添加双向数据绑定的功能
- data中的数据可以给表单元素赋值 M—>V
- 当表单元素值发生变化去修改data中的数据为当前表单元素的值 V—>M
- 语法糖原理
<div id="app"> <h4>{{msg}}</h4> <!-- <input type="text" v-model="msg"> --> <!-- 双向数据绑定 --> <!-- 1.M -- >V 数据复制给表单元素--> <!-- 2.V -- >M 表单元素值改变,修改数据为当前表单元素的值--> <!-- :value="msg" : 给表单元素赋值 --> <!-- $event : input事件的事件对象 --> <!-- $.event.target : input的dom对象(事件的触发源) --> <!-- $event.target.value : 输入框的内容 --> <!-- msg=$event.target.value : 把输入的内容重新修改msg的值 --> <input type="text" :value="msg" @input="msg=$event.target.value"> <!-- 总结: v-model="msg" 等价于 :value="msg" @input="msg=$event.target.value--> </div> <script src="./vue.js"></script> <script> const vm = new Vue({el: '#app',data: {msg: 'Hi vue'} }) </script>
- 绑定表单元素
<div id="app"> <!-- 文本域 --> <textarea v-model="textareaStr"></textarea> <br /> <!-- 复选框 --> <!-- 1.单个复选框 值是布尔类型 --> <input type="checkbox" v-model="isChecked"> <!-- 2.多个复选框 --> <input type="checkbox" value="ball" v-model="hobby"> 听音乐 <input type="checkbox" value="dama" v-model="hobby"> 敲代码 <input type="checkbox" value="book" v-model="hobby"> 面试题 <br /> <!-- 单选框 --> <input type="radio" value="男" v-model="gender"> 男 <input type="radio" value="女" v-model="gender"> 女 <br /> <!-- 下拉框 --> <select v-model="city"><option value="">请选择</option><option value="1">北京</option><option value="2">上海</option><option value="3">广州</option> </select> </div> <script src="./vue.js"></script> <script> const vm = new Vue({el: '#app',data: {textareaStr: 'Hi vue',isChecked: true,hobby: [],gender: '女',city: ''} }) </script>
v-clock指令
- 作用:解决模板中的插值表达式的闪烁问题
<style>/* 在模板未解析前生效 */[v-cloak] {display: none;}
</style>
<body><!-- 解决闪烁问题:加v-cloak指令和样式--><div id="app" v-cloak><h4>{{msg}}</h4></div><script src="./vue.js"></script><script>const vm = new Vue({el: '#app',data: {msg: 'Hi vue'}})</script>
</body>
v-once指令
- 作用:让模板的某个容器只渲染一次,当他依赖的数据发生改变的时候,被指令修饰的容器不会再次渲染
<div id="app"><!-- 这个容器只想渲染一次,不再受数据的影响 --><h4 v-once>{{msg}}</h4><h1>{{msg}}</h1>
</div>
<script src="./vue.js"></script>
<script>const vm = new Vue({el: '#app',data: {msg: 'Hi vue'}})
</script>
自定义指令
- 概念:内置指令无法实现功能,自己封装一个指令,即就是自定义指令
- 定义一个
v-focus
指令,作用是让input自动获得焦点 - 全局自定义指令
Vue.directive('指令的名称','指令配置对象')
<div id="app"> <input type="text" v-focus> </div> <script src="./vue.js"></script> <script>// 参数1:指令的名称,不包含v-,但是在使用指令的时候需要加上v-// 参数2:指令配置对象,固定属性 inserted 指定的一个函数,// 1. 该函数会在通过指令标记的元素,创建完毕之后执行// 2. 该函数有一个默认参数 el 指的是使用这个指令的元素Vue.directive('focus', {inserted(el) {// 获取焦点el.focus()}}) </script>
- 局布自定义指令
属性名称(指令的名称):属性的值(指令的配置对象)
<div id="app"><input type="text" v-myfocus>
</div>
<script src="./vue.js"></script>
<script>const vm = new Vue({el: '#app',// vue配置对象提供了一个选项:directives 对应 对象directives: {myfocus: {inserted(el) {el.style.height = '50px'el.focus()}}}})
</script>
功能
过滤器
- 全局过滤器 (全局定义,在每个视图中均可使用)
Vue.filter('过滤器名称','处理函数')
<div id="app"><!-- | 在这里叫做管道符 --><h3>{{msg|myFilter}}</h3> </div> <div id="app2"><h3>{{msg|myFilter}}</h3> </div> <script src="./vue.js"></script> <script> // 全局过滤器Vue.filter('myFilter', (value) => {// value就是使用该过滤器前面的插值表达式的执行结果// 需要对value进行转换,将换后的结果返回出去// 必须有返回值 返回的值会输出到模板中return String(value).padStart(6, 0)})// 实例1new Vue({el: '#app',data: {msg: 103}})// 实例2new Vue({el: '#app2',data: {msg: 205}}) </script>
- 局部过滤器 (在vue实例中定义,仅能给vue实例管理的视图使用)
属性名(过滤名称):属性值(过滤器处理函数)
<div id="app"> <!-- | 在这里叫做管道符 --> <h3>{{msg|myFilter}}</h3> </div> <script> new Vue({el: '#app',data: {msg: 103},// vue配置对象中,提供了选项filters,指向的是对象,可以定义多个过滤器filters: {myFilter(value) {return String(value).padStart(6, 0)}} }) </script>
- 总结
- 全局 Vue.filter(‘过滤器名称’,(value)=>{// 管道符前js表达式只需结果 // 返回处理好的数据即可})
- 局部 new Vue({filters:{‘过滤器名称’:(value)=>{// 管道符前js表达式只需结果 // 返回处理好的数据即可}}})
操作dom
- vue提供的属性:
ref
<div ref='myBom'></div>
<script>// this就是vue的实力// $refs是对象,收集了视图中所有使用了ref属性的dom元素this.$refs.myDom
</script>
<div id="app"><!-- 盒子 --><div ref="box" class="box">盒子</div><span ref="span">标签</span><!-- 特殊情况,在v-for的标签上加了ref --><ul><!-- v-for="序号 in 次数" 序号从1开始 --><li ref="li" v-for="i in 3" :key="i">{{i}}</li></ul><!-- 按钮 --><button @click="getHeight()">获取盒子高度</button>
</div>
<script src="./vue.js"></script>
<script>const vm = new Vue({el: '#app',methods: {getHeight() {// 先拿到dom容器,在获取高度console.log(this.$refs)const box = this.$refs.boxconsole.log(box.offsetHeight)// 如果给v-for的标签加了ref,会获取到所有的元素,就是数组 [dom,dom,dom]console.log(this.$refs.li)}}})
</script>
计算属性
- 目的:模板内处理数据,如果逻辑较为复杂,对应的js表达式也会复杂,模板内的业务逻辑繁重,可维护性差
- 作用:过计算属性,来处理这些复杂逻辑,降低模板的复杂度,提供模板的可维护性
- 适用场景
- 当模板内依赖data中的数据,但是需要经过较为复杂的逻辑处理,才能得到想要的数据,此时可以使用计算属性
- 复杂逻辑在声明计算属性时候进行,模板内使用数据即可
- 特点
- 计算属性有缓存,提高程序性能
- 当依赖的数据改变,计算属性也会改变
<div id="app"><!-- 复杂逻辑 --><h3>{{msg.split('').reverse().join('')}}</h3><!-- 计算属性 --><h3>{{reverseMsg}}</h3>
</div>
<script src="./vue.js"></script>
<script>const vm = new Vue({el: '#app',data: {msg: 'Hi vue'},// 声明计算属性computed: {// 属性名称(计算属性的名称)// 属性的值(计算属性的处理函数)reverseMsg() {// 对依赖的数据进行处理,且进行returnreturn this.msg.split('').reverse().join('')}}})
</script>
- 总结
- computed是vue的配置对象
- computed指向的是一个对象,对象可以声明多个计算属性
- 属性名称(计算属性的名称)
- 属性的值(计算属性的处理函数)
- 对需要依赖的数据,进行逻辑上的处理
- 处理完毕后,需要return出去,返回的值就是计算属性的值
- 在模板中使用计算属性,和使用data的方式是一样的
- 虽然在计算属性中声明的是函数,但是在模板中使用,当中数据来使用,不需要加括号