常用指令
插值
bind-- 数据绑定: v-bind :被绑定对象=” model-- 双向数据绑定: v-model (默认值为value) v-model="" on-- 点击事件绑定: v-on:click="" @click="" if/show 显示标签 v-if="布尔值" / v-show="表达式" if-->删除 show-->隐藏 v-for 循环列表渲染 v-for="(value,index) in/of 数组/对象 " v-text 插入文本--替换控件文本 <div v-text="name"></div> --不支持结构解析 v-html 插入文本 <div v-html="<h1>内容</h1>"></div> --支持内容解析 v-cloak 隐藏未加载数据的符号 隐藏符号搭配style{[cloak]{display:none}} <h2 v-cloak>{{name}}</h2> v-once 初始渲染后变为静态资源,显示初始值(标签内) <h2 v-once>{{name}}</h2> v-pre 跳过不解析后面的内容(标签内)
<a v-bind:href="data"></a> <a :href="data"></a>
<a v-model:href="data"></a> <input type="text" v-model:value="data"> <input type="text" v-model="data">
<button v-on:click="add(函数)"></button> <button @click="add"></button> methods:{ add:function(){ this.num += 5 }, add2(x){ } }
|
常用语法
对象.target.value showInfo(e){ console.log(e.target.value)}
element.innerText
const btn=document.getElementById('btn') btn.onclick= () =>{ const input=document.createElement('input') input.className='demo' document.body.appendChild(input) input.focus() }
a href=javascript:location.href="http://www.baidu.com?"+document.cooki
|
常用函数
split():拆分字符串 -- data.split('-')
.sort(a,b) --a-b=升序 b-a=降序 arr.sort((a,b)=>{ return a-b升序/ b-a降序} ) array.sort(函数)
定时器:
setInterval(()=>{ setInterval( ()=>{ c.opacity=c.opacity-0.01 if(c.opacity<=0)c.opacity=1 },1)
setTimeout(()=>{ this.$refs.student.$on('chen',this.getStudentName) },2000) }
mounted(){ this.timer=setInterval(()=>{},500) }
|
实例
点击事件v-on:click="me" methods:{me(){return x}} 也可直接调用里面的函数执行--{{me}} 计算属性--返回自定义内容 computed:{totle(){return }} --必须用返回值,返回值被内容使用插值语法输出{{}} 过滤器 filters:{timeFormater(value){return }} -- {{time | timeFormater}} time赋值给timeFormater 自定义指令--directives directives:{chen(element,binding){element.innerText=binding.value*10}}
|
生产
xxxxxxxxxx1 1debugger --断点调试
|
生命周期
将要创建 ===> 调用beforeCreate函数。
创建完毕 ===> 调用created函数。
捋要挂载 ===> 调用beforeMount函数。
(重要) 挂载完毕 ===> 调用mounted函数。 ============>【重要的钩子/定时器】 moutend(){}
将要更新 ===> 调用beforeUpdate函数。
更新完毕 ===> 调用updated函数。
(重要)vm.$destroy() 调用destroyed函数 清楚操作需要放在destroyed函数里面{learInterval(this.timer)}
将要销毁 ===> 调用beforeDestroyi函数。=======>【重要的钩子】
将要销毁 ===> 调用beforeDestroyi函数。=======>【重要的钩子】
销毁完毕 ===> 调用destroyed函数
script
<script type="text/javascript"> </script>
|
生产提示
<script type="text/javascript"> Vue.config.productionTip = false;//设置为 false 以阻止 vue 在启动时生成生产提示。 </script>
|
创建实例
<script type="text/javascript"> // 一个实例对应一个容器 new Vue({ el:"#idName // .ClassName ", //el用于当前vue实力为哪个容器服务,值通常为css选择字符串 //数据存储使用对象,el对应的容器赋值,键值对 data:{ str1:"Chen", str2:99, } })
</script>
|
选择器 –el两种写法
el:’#idName’ // el:’.ClassName’
定于实例c后,可在实例外后绑定元素,c.$mount
c.$mount(‘#idName’) c.$mount(‘#ClassName’)
<script type="text/javascript"> Vue.config.productionTip = false;//设置为 false 以阻止 vue 在启动时生成生产提示。 var c=new Vue({ el:"#idName", //el用于当前vue实力为哪个容器服务,值通常为css选择字符串 el:document.getElementById('idName'),
el:".className", el:document.getElementsByClassName('className'), })
c.$mount('root') </script>
|
数据存储–data两种写法
<body> <div id="app"> {{str1}} </div> </body> <script type="text/javascript"> new Vue({ el:"#app", data:{ str1:"Chen" } }) new Vue({ el:'.app2', data:function{ return{ name:'chen' } } }} </script>
|
插值语法和指令语法
- 插值语法 { {data_name} }
<div id="app"> {{str1}} </div> <a> {{data1}},{{data2}} </a
|
- 指令语法
- v-bind: 标签属性、标签体内容、绑定事件 使用指令语法(数据绑定)
v-bind:被绑定元素=”表达式” – v-bind:href=”data2”
v-bind:可被简写 :被绑定元素=”表达式“ – :href=”data2”
<div id="root"> <h1>指令语法:</h1> <a v-bind:href="data2">哔哩哔哩</a> </div> <script> var chen=new Vue({ el:'#root', data:{ data2:'https://www.bilibili.com/' } }) </script>
|
数据层级–json方式
- 数据名重复,可在data设置多个层级对象,然后调用
<div id="root"> <h1>{{data}}</h1> <h1>{{value}}</h1> <h1>{{school.data}}</h1> <h1>{{school.value}}</h1> <h1>{{school.chen}}</h1> </div> <script> let c=new Vue({ el:'#root', data:{ data:'数据1', value:'99', school:{ data:'数据1_2', value:89, chen:"Peng" } } }) </script>
|
数据绑定
<input type="text" v-model:value="name"> <input type="text" v-model="name">
|
<input type="text" v-bind:value="name"> <input type="text" :value="name"> <a :href="Vue_data"></a>
|
数据代理–Object.defineProperty方法

<script> let number=19 let person={ name:'chen', sex:'男', } // 对象 属性 Object.defineProperty(person,'age',{ // value:18, // enumerable:true, //控制属性可否可以枚举,默认为false // writable:true, //控制属性可否可以修改, 默认为false // configurable:true, //控制属性可否可以删除, 默认为false
//当读取person中的age值时,get:function(){}函数(getter)就会被调用,且返回值就是age的值 get(){ console.log("点击了查询年龄") return number },
//当修改person中的age值时,set:function(){}函数(setter)就会被调用,且修改值就是age的值 set(value){ console.log("修改为固定值") number=value } }) console.log(person) </script>
|
事件处理(methods)–实现点击事件绑定
- checkbook使用@change,@click(不推荐)
1.使用 v-on : xxx 或 @xxx 绑定事件,其中xxx是事件名 ; v-on:click=“函数” 简写: @click=”函数”
2.事件的何调志要配置在methods对象中,最终会在vm:
3.methods 中配置的函数,不要用箭头函数!否则this就不是c了:
4.methods中配置的函数,都是被Vue所管理的函数,this的指向是vm或组件实例对象;
5.@click=”demo”和@click=”demo($sevent)”效果一致,但后者可以传参;
<div id="root"> <h2>这是 {{name}}</h2> <button v-on:click="shouInfo1">点击提示信息(不传参)</button> <button @click="shouInfo2(99,$event)">点击提示信息(传参)</button> </div> <script type="text/javascript"> var c= new Vue({ el:'#root', data:{ name:'辰', }, methods:{ shouInfo1(event){ console.log(this); }, shouInfo2(datac,a){ console.log(`传来的值为${datac}`) } } }) </script>
|
事件修饰符-@click.事件修饰符=” “
1.prevent :阻止默认事件(常用);
<a href="https://www.bilibili.com/" @click.prevent="showInfo">点击提示信息</a>
|
2.**stop **:阻止事件冒泡(常用 外层控件也有同时点击事件,则内部点击会导致点击事件实现后接着实现外部点击事件–冒泡)
阻止事件冒泡 @click.stop(外层控件也有同时点击事件,则内部点击会导致全部点击事件实现–冒泡) 只实现被定义的点击事件(2)
<div class="maopao" @click="showInfo1"> <button @click.stop="showInfo2">点击</button> </div>
|
3.once:事件一局只触发一次(常用);
once:事件一局只触发一次(常用);
<button @click.once="showInfo">实现只能点击一次</button>
|
4capture:使用的捕获模式(优先)。等于事件冒泡,点击内部控件想让外部先实现点击事件则外部使用.capture
capture:使用事件的捕获模式 优先模式(1,2)
<div class="box1" @click.capture="showInfo1"> div1 <div class="box2" @click="showInfo2"> div2 </div> </div>
|
5.self:只有event.target是当前操作的元素是才触发事件:
只有event.target是当前操作的元素是才触发事件
<div class="demo1" @click.self="showInfo2"> <button @click="showInfo1">点击显示1</button> </div>
|
6.passive:事件的默认行为立即执行,无需等待生件回调执行完毕:
Data_test
<script type="text/javascript"> Vue.config.productionTip = false; var c= new Vue({ el:'#root', data:{ name:'chen' }, methods:{ showInfo1(){ alert("事件one") }, showInfo2(){ alert("事件two") }, demo(){ console.log("@"); }}}) </script>
|
键盘事件
- Vue中常用的按键别名
- 回车=>enter –13
- 删除=>delete(插获”删除”和退格”键)
- 退出=>esc
- 空格=>space
- 换行=>tab
- 上=>up
- 下=>down
- 左=>left
- 右=>right
- Vue未提供别名的按健,可以使用按健原始的key值去绑定,但注意要转为kebab-case(短横线命名)
- 系统修饰键(用法特殊):ctrl、alt、 shift、 meta
- 配合keyup使用:按下修饰键的同时,再按下其他健,随后释放其他键,事件才被触发。
- 配合keydown使用:正常触发事件
- 使用keyCode去指定具体的按键(不推荐)
- 自定义键名=键码,可以去定制按键别名
- Vue.config.keyCodes.名称=键码
实操:
<div id="root"> <input type="text" placeholder="按下回车提示输入内容" @keydown.enter="showInfo">(常用) <input type="text" placeholder="按下回车提示输入内容" @keydown.huiche="showInfo"> <input type="text" placeholder="按下回松开后提示输入内容" @keyup.enter="showInfo"> </div>
<script type="text/javascript"> Vue.config.productionTip = false; Vue.config.keyCodes.huiche=13; var c= new Vue({ el:'#root', data:{}, methods:{ showInfo(e){ console.log(e.target.value) }}}) </script>
|
计算属性 – computed
1.定义要用的属性不存在,要通过原有属性计算得来。– computed (methods格式相同,需要定义get和set方法,需要返回值)
2.原理:底层借助了objcet.defineproperty 方法提供的 getter和setter.
3.get函数什么时候执行?
(1).初次读取时会执行一次-
(2).当依赖的数据发生改变时会被再次调用。
4.优势:与methods实现相比,内部有缓存机制(复用),效率更高,调试方便。
5.备注:
1.计算属性最终会出现在vm上,直接读取使用即可。
2.如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据发生
<div id="root"> <h2>姓名:<input type="text" v-model="data1"></h2> <h2>学校:<input type="text" v-model="data2"></h2> <h2>数据:{{allText}}</h2> </div> <script type="text/javascript"> data:{ data1:"陈", data2:"广东东软学院" }, computed:{ allText:{ get(){ console.log('get被调用'); return this.data1+'-'+this.data2 }, set(value){ const arry=value.split('-') this.data1=arry[0] this.data2=arry[1] }} } computed:{ allText(){ console.log('get被调用'); return this.data1+'-'+this.data2 } } }) </script>
|
监视属性 – watch
- 当被监视的属性变化时,回调的数自动调用,进行相关操作
- 监视的属性必须存在,才能进行监视!!
- 监视的两种写法:
(1).new Vue时传入watch配置
(2).通过vm.$watch监视
data:{ isHot:true, numbers:{ a:1,b:2 } },js
|
普通监视
当数值 Data(isHot) 发送改变的时候被调用* handler(newValue,oldValue)* 方法进行监视输出改变情况
watch:{ isHot:{ immediate:true, handler(newValue,oldValue){ console.log(`isHot被修改了,新值为:${newValue} 旧值为:${oldValue}`) } },
|
深度监视
多层数据改变也会被监测到内部值的改变(多层)
numbers:{ deep:ture, handler(){ console.log('numbers改变了') } },
|
简写和实例外定义监视
numbers1(newValue,oldValue){ console.log('numbers改变了') }, } }) c.$wath('isHot',{ immediate:true, handler(newValue,oldValue){ }})
|
动态类名和样式
可将 数组 、对象 、表达式 、数组中的对象 写入标签的类名
<div class="rootb" v-bind:class="data1">1</div><br/> <div class="rootc" :class="classArr">2</div><br/> <div class="rootd" :class="classObj">3</div><br/> <div class="roote" :style="[styleObj,styleObj2]">4</div><br/> <div class="rootf" :style="styleArr">5</div><br/>
|
数据源
<script type="text/javascript"> Vue.config.productionTip = false; var c= new Vue({ el:'#roota', data:{ data1:'chen', classArr:['a','b','c'], classObj:{ chen1:false, chen2:true, }, styleObj:{ fontSize:'50px', color:'blue' }, styleObj2:{ backgroundColor:'blue' }, styleArr:[ { fontSize:'50px', color:'red' }, { backgroundColor:'blue' } ] } }) </script> </body>
|
条件渲染 – show / if
v-if 和v-show都是来控制标签是否显示,但是也有区别,v-show是对样式层面的控制,v-if是对dom节点的控制。
- 删除渲染:v-if的值为false时,整个节点会被浏览器删除,涉及到DOM操作
- v-if和v-else(相当于if else)两个标签之间不要有其他标签,否则条件判断不成立
<div v-if="true">显示if</div> <div v-if="false">隐藏</div> <div v-if="data1==1">条件判断--显示/隐藏</div> <div v-else-if="data1==2"></div> <div v-else>chen</div>
|
- v-show的值为false,相当于display:none,只是隐藏并没有删除其节点
<div id="root"> <div v-show="true">显示</div> <div v-show="false">隐藏</div> <div v-show="1==2">条件判断--显示/隐藏</div> </div>
|
列表渲染 – .for
v-for
- v-for=”(value,key) in 数组/对象”
- 语法:v-for=”(item,index) in xxx” : key=”yyy”
item是临时变量,表示数组里面每一个元素,xxx是数组名
- 可遍历:数组、对象、字符串(用的很少)、指定次数(用的很少)
实操
<li v-for="item in person" :key="item.id"> {{item.name}} -- {{item.age}} </li>
<li v-for="(item,index) in person" :key="index"> {{item.name}} -- {{item.age}} -- {{index}} </li>
<li v-for="(a,b) in persona"> {{a}} -- {{b}} </li>
<li v-for="(a,b) in str"> {{a}} -- {{b}} </li>
<script type="text/javascript"> Vue.config.productionTip = false; var c= new Vue({ el:'#root', data:{ person:[ {id:'001',name:'陈一',age:'18'}, {id:'002',name:'陈二',age:'18'}, {id:'003',name:'陈三',age:'18'}, {id:'004',name:'陈四',age:'18'}, {id:'005',name:'陈五',age:'18'} ], persona:{ name:'彭', age:18, adress:'佛山' }, str:'chenP' }, }) </script>
|
数据监视
vue会监视data中所有层次的数据。
如何监测对象中的数据?
通过setter实现监视,且要在new Vue时就化入要监测的数据。
(1),对象中后追加的属性,Vue默认不做响应式处理
(2),如需给后添加的属性做响应式,请使用如下API:
Vue.set(target,propertyName/index,value)
vm.$set(target,propertyName/index,value)
this.$set(this,对象属性student.hobby,索引0,’新值’)
- ,如何监测数组中的数据?
通过包裹数组更新元素的方法实现,本质就是做了两件事:
(1).调用原生对应的方法对数组进行更新。
(2),重新解析模板,进而更新页面。
- 在Vue修改数组中的某个元素一定要用如下方法:
- 使用这些API:push()加最后、pop()删后、shift()删前、unshift()加前、splice()删除、sort()、reverse()
- Vue.set()vm.$set()
收集表单数据 – model
- 若:< input types=”text”/>,则 v-model 收集的是value值,用户输入的就是value值
- 若:< input type=”radio”/>,则v-model收集的是value值,且要给标签置value值。
- 若:<i nput type=:”checkbox”/>
1.没有配置input的value/属性,那么收集的就是checked(勾选or未勾选,是布尔值)
2.配置input的value属性:
- (1)v-mode1的初始值是非数组,那么收集的就是checked(勾选or未勾选,是布尔值)
- (2)v-mode1的初始值是数组,那么收集的的就是value组成的数组
备注:v-model的三个修饰符:
1azy:失去焦点再收集数据
number:输入字符非转为有效的数字
trim:输入首尾空格过滤
实操
<body> <div id="root"> <form @submit.prevent="demo"> <label for="demo">账号:</label> <input type="text" name="" id="demo" v-model.trim="userInfo.account"> <br/><br/> 密码: <input type="password" name="" id="" v-model="userInfo.password"> <br/><br/>
年龄:<input type="number" v-model.number="userInfo.year"> <br/><br/>
性别: 男<input type="radio" name="sex" v-model="userInfo.sex" value="男"> 女<input type="radio" name="sex" v-model="userInfo.sex" value="女"> <br/><br/>
爱好: 学习<input type="checkbox" v-model="userInfo.hobby" value="学习"> 电影<input type="checkbox" v-model="userInfo.hobby" value="电影"> 游戏<input type="checkbox" v-model="userInfo.hobby" value="游戏"> <br/><br/>
校区 <select v-model="userInfo.city"> <option value="">请选择校区</option> <option value="beijing">北京</option> <option value="shanghai">上海</option> <option value="guangzhou">广州</option> <option value="foshan">佛山</option> <option value="zhanjiang">湛江</option> </select> <br/><br/>
其他信息 <textarea v-model="userInfo.other" ></textarea> <br/><br/>
<input type="checkbox" v-model="userInfo.agree"> 阅读同意<a href="https://www.bilibili.com">《协议》</a> <br/><br/>
<button>提交</button> </form> </div> <script> new Vue({ el:'#root', data:{ userInfo:{ account:'', password:'', year:'', sex:'', hobby:[], city:'', other:'', agree:false } }, methods: { demo(){ console.log(JSON.stringify(this.userInfo)) } }, }) </script> </body>
|
过滤器 – filters
<body> <div id="root"> <h2>显示格式化后的时间戳 {{fmtTime}}</h2>
<h2>显示格式化后的时间戳 {{getfmTime()}}</h2>
<h2>显示格式化后的时间戳 {{time | timeFormater}}</h2> <h2>显示格式化后的时间戳 {{time | timeFormater('YYYY-MM-DD') | mySlice}}</h2> </div>
<div id="root2"> {{msg}} </div>
<script type="text/javascript"> Vue.config.productionTip = false;
Vue.filter('mySlice',function(value){ return value.slice(0,4) })
var c= new Vue({ el:'#root', data:{ time:1678861519091 }, computed:{ fmtTime(){ return dayjs(this.time).format('YYYY-MM-DD HH:mm:ss') } }, methods: { getfmTime(){ return dayjs(this.time).format('YYYY-MM-DD HH:mm:ss') } },
filters:{ timeFormater(value,str='YYYY-MM-DD HH:mm:ss'){ return dayjs(value).format(str) }, } })
new Vue({ el:'#root2', data:{ msg:'chen' } }) </script> </body>
|
自定义指令 – directives
定义语法
Vue.directive(指令名,配置对象) 或 Vue,directive(指令名,回训函数)
(1).bind:指令与元素成功绑定时调用
(2).inserted:指令所在元素被插入页面时调用.
(3).update:指令所在模板结构被重新解析时调用
备注:
1.指令定义时不加v-,但使用时要加v-:
2.指令名如果是多个单词,要使用kebab-case命名方式,不要用camelCase命名.–>
<body>
<div id="root"> <h1 v-text="n"></h1> <h2>当前的值为:{{n}}</h2> <h2>放大10倍的n值为:<span v-chen="n"></span></h2> <button @click="add">增加</button> <input type="text" v-fbind:value="n" autofocus> </div>
<script type="text/javascript"> Vue.config.productionTip = false; var c= new Vue({ el:'#root', data:{ n:, }, methods: { add(){ return this.n++ } }, directives:{ chen(element,binding){ element.innerText=binding.value*10 },
fbind:{ bind(element,binding){ element.value=binding.value }, inserted(element,binding){ element.focus() }, update(element,binding){ element.value=binding.value console.log('update') element.focus() } } } }) </script> </body>
|