1.v-once
2.v-html
插入html内容时直接使用{{}}将会被渲染成普通文本,使用v-html才会被渲染为html元素
<h1>{{htmlTxt}}</h1>
<h1 v-html>{{htmlTxt}}</h1>
data:{ htmlTxt:"<span>hello</span>" }
3.计算属性
<div>{{firstname+lastname}}</div> data:{ firstname:"张", lastname:"三" }
在HTML中使用js表达式时每次渲染都会计算一次,无论值有没有改变。
使用计算属性会提高渲染效率;
<div>{{fullname}} </div> data(){ return { firstname:'张', lastname:'三' } }, computed:{ fullname:function(){ return this.firstname + this.lastname } },
computed属性在变量值多次修改时会提高效率,它会将上次计算结果缓存下来,只有在变量内容改变时才会重新计算,而第一种表达式写法在每次都会重新计算。
//字符串逆序显示 <div>{{word.split("").reverse().join("")}}</div> data(){ return { firstname:'张', lastname:'三', word:'music' } },
//数组过滤 <ul> <li v-for="item,index in oddnums" :key="index"> <h3>{{item.num}}</h3> </li> </ul> data(){ return { nums:[ { id:1, num:1 }, { id:2, num:2 }, { id:3, num:3 }, { id:4, num:4 } ] } }, computed:{ oddnums:function(){ return this.nums.filter((item)=>{ return item.num%2 == 0 }) } },
4. class绑定
//通过对象的方式决定是否存在某个类 对象里面可以放多个变量 <div :class="{active:isActive}"></div> //也可以和固定class同时使用 <div class="page" :class="{active:isActive}"></div> //直接放对象 <div :class="styleObj"></div> //直接放数组 <div :class="styleArr"></div>
//数组和对象混合使用
<div :class="styleObjArr"></div> data(){ return { isActive:true, styleObj:{active:false,test1:true,"test-1":false} styleArr:['red-bg','color'],
styleObjArr:['red-bg',{active:true}]
}
}
<style> .active{ width: 200px; height: 200px; background-color: skyblue; } </style>
5.事件修饰符
<!-- .stop阻止事件冒泡,否则 clickparent clickevent 都会触发 --> <div class="btnparent" @click="clickParent"> <button @click.stop="clickEvent">按钮</button> //不加stop 输出clickparent clickevent 加stop只输出clickevent </div> clickParent(){ console.log('clickParent') }, clickEvent(){ console.log('clickEvent') },
6.表单输入绑定
<!-- 表单输入绑定 双向绑定--> <div id="app"> <!-- 输入框绑定 --> <input type="text" v-model="username"> <h3>{{username}}</h3> <!-- 复选框绑定 --> <span v-for="(item,index) in fruits" :key="index" > {{item}} <input type="checkbox" v-model="checked" :value="item"> </span> <h2>{{checked}}</h2> <!-- 单选框绑定 --> <span v-for="(item,index) in fruits" :key="index" > {{item}} <input type="radio" v-model="radiochecked" :value="item"> </span> <h2>{{radiochecked}}</h2> <!-- 下拉选择框 --> <select name="select" id="" v-model="selected" > <option value="" disabled>请选择</option> <option v-for="(item,index) in fruits" :key="index" :value="item">{{item}}</option> </select> <h2>{{selected}}</h2> <!-- 下拉复选框 按住ctrl复选 --> <select name="select" id="" v-model="mutiselected" multiple="multiple"> <option v-for="(item,index) in fruits" :key="index" :value="item">{{item}}</option> </select> <h2>{{mutiselected}}</h2> <!-- 绑定值一般返回字符串 使用number修饰符修改 --> <h2>未转换</h2> <input type="text" name="age" v-model="age" > <h3>{{age}}----{{typeof age}}</h3> <h2>转换后</h2> <input type="text" name="age" v-model.number="age" > <h3>{{age}}----{{typeof age}}</h3> </div> data:{ age:'', fruits:['苹果','香蕉','梨'], checked:[], selected:'', mutiselected:[], radiochecked:'', username:'姓名', }
7.过渡动画(有问题,进入动画不生效)
<!-- 过渡动画 --> <button @click="isShow = !isShow">切换按钮</button> <transition name="slide"> <!-- todo 只有淡出动画,进入动画无效 --> <div v-if="isShow" class="changediv"></div> </transition> data:{ isShow:true } <style> .slide-enter-active, .slide-leave-active { transition: all 2s ease; } .slide-enter, .slide-leave-to /* .slide-leave-active below version 2.1.8 */ { transform: translateX(500px); /* opacity: 0; */ } .changediv{ width: 200px; height: 200px; background-color: red; } </style>
8.vue生命周期
beforecreate:数据和事件方法此时还未绑定到创建的vue对象上
created: 数据data和事件方法methods已经绑定到vue对象上
beforemount:渲染之前,根据数据生成的dom对象是获取不到的
mounted:渲染之后,可以获取到数据生成的dom对象
beforeupdate:数据内容更新,但还未渲染到页面元素上
updated: 数据更新,页面内容也更新
beforedestory: 应用销毁之前
destoryed:应用销毁之后
注:页面上使用v-if时,每次true都会触发 beforecreate created beforemount mounted事件,每次false都会触发 beforedestory destoryed事件
v-show只有第一次会触发,其余时候不会,原理(display:none)
9.组件间传值
父组件向子组件传值:使用props
子组件向父组件传值1:使用$emit触发父组件事件,父组件监听该事件
//父组件 <child @fathermethod="fathermethod"></child> fathermethod(data){ //接收子组件传值数据并处理 } //子组件 childMethod(){ this.$emit('fatherMethod',data) }
子组件向父组件传值2:父组件直接将函数传递给子组件,子组件调用函数直接修改父组件的值
//父组件页面 <child :event="fathermethod"></child> methods:{ fathermethod(data){ //console.log(data) } } //子组件页面 props:{ event } methods:{ childMethods(){ this.event(data) } }
子组件向父组件传值3:使用$parent直接调用父组件函数或修改父组件数据值
//子组件页面
<button @click="$parent.fathermethod(data)"></button> <button @click="$parent.fatherdata = data"></button>
其他:$root.$children[0]....
10.组件上使用v-model
//子组件 <template> <input type="text" @input="$emit('input', $event.target.value)" v-model="username" > </template> <script> export default { name: 'modelItem', props:{ username:String }, } </script> //父组件 <template> <div class="home"> <model-Item v-model="username"/> <h3>{{username}}</h3> </div> </template> <script> import modelItem from '@/components/v-model' export default { name: 'Home', components: { modelItem }, data(){ return{ username:'' } } </script>
11.插槽
//slot.vue <template> <div class='container'> <div class="title">标题</div> <div class="content"> <slot></slot> </div> </div> </template> //home.vue <template> <div class="home"> <!-- slot里面的变量内容只跟父元素有关 --> <slot-Item> <p>插槽内容,{{username}}</p> </slot-Item> </div> </template> data(){ return{ username:'11' } },
12.动态组件
使用 is
attribute 来切换不同的组件
<component :is="currentTabComponent"></component>
<!-- 失活的组件将会在第一次创建后被缓存!-->
<keep-alive>
<component v-bind:is="currentTabComponent"></component>
</keep-alive>
13.less
声明变量: @main-color:#ccc
混合:
.default{ margin:0; padding:0; } .container{ .default() border:1px solid @main-color }
其他:Less 快速入门 | Less.js 中文文档 - Less 中文网 (bootcss.com)
14.sass
变量声明:$primary-color: #333;
父选择器标识符:&
.article a{ &:hover{ //此处&:hover 等价 a:hover .... } }
嵌套:Sass: Sass Basics | Sass 中文网 (bootcss.com)