v-if&v-show
<div class="app">
v-show如果值为true 相应的节点就会显示,就算值是flase,在dom中依然存在,只是把display的值改成none
<h1 v-show="false">我爱你</h1>
v-if是直接将dom删除了,在dom文档中已经找不到对应的dom,变成了注释
<h1 v-if="false">我爱你</h1>
如果频繁使用 就使用v-show 可以节约性能开销
如果短暂使用,例如页面一开始加载的时候进行判断显示 优先使用v-if
实际开发中,使用v-if比较多
v-for比v-if优先级高,不推荐同时使用
解决v-if和v-for同时使用的方法是 使用computed计算属性来过滤,之后再渲染计算属性的数据
<li v-for="(item,index) in arr">{{item}}</li>
</div>
<script src="./node_modules/vue/dist/vue.js"></script>
<script>
new Vue({
el: '.app',
data: {
msg: 123,
list: [1, 2, 3]
},
computed: {
arr: function () {
return this.list.filter(r => r > 1)
}
},
methods: {
}
})
</script>
组件
<div class="app">
组件名是大写 在浏览器编译的时候会转成小写,导致找不到想应的组件,可以全变成小写,中间加-来解决
<child1></child1>
所有的组件都需要使用一个div来包裹
<div><child-a/></div>
<div><child-b/></div>
模板的第二种写法,使用template加id
<template id="childB">
<div>
<h1>我是程序员</h1>
<h1>我是程序员</h1>
</div>
</template>
</div>
<script src="./node_modules/vue/dist/vue.min.js"></script>
<script>
全局组件
模板的第一种写法
Vue.component('child1',{
template:`<h1>我是child1</h1>`
})
Vue.component('childA',{
template:`<h1>我是childA</h1>`
})
Vue.component('childB',{
template:'#childB'
})
new Vue({
el:'.app'
})
</script>
过滤器
<div class="app" v-cloak>
|过滤器的管道符
<h1>{{'我是李云龙:山本我日你先人'|fn('宝贝')|fn('sad')}}</h1>
<h1>{{'我爱张sir'|str('金牌厨师')}}</h1>
<h1>{{'hello'|he}}</h1>
</div>
<script src="./node_modules/vue/dist/vue.js"></script>
<script>
/* 全局过滤器 */
Vue.filter('fn',function(v,s){
/* v就是管道符左边的数据 */
console.log(v);
return v/* .substring(0,v.indexOf(':')) */+s
})
new Vue({
el:'.app',
/* 局部过滤器 */
filters:{
str(v,s){
return v+s
},
he(v){
return v.split('').reverse().join('')
}
}
})
消除渲染时的过渡
当页面刷新的时候data中的数据还没有渲染出来,页面中就会显示原本写的插值语法,这时候就需要消除这个bug
在绑定的实例化对象的元素上上添加v-cloak 并在style样式中添加(只要前面加上v-都可以实现,随意命名,通常使用clock)
[v-cloak]{
display: none;
}
自定义指令
<div class="app">
<input type="text" v-bg>
<input type="text" v-focus="{background:'yellow'}">
<div style="width: 100px;height: 100px;" v-bg></div>
元素身上使用驼峰命名的属性,fontSize在元素身上会转化为fontsize导致两者的名字不一致,从而作用不生效
<p v-sty="{background:'pink',color:'yellow'}">我是程序员</p>
</div>
<script src="./node_modules/vue/dist/vue.js"></script>
<script>
/* 全局自定义指令 简写方式 不适用于DOM操作 */
/* 定义指令要方法实例化Vue对象前面 */
Vue.directive('bg', function (el) {
/* 回调的第一个参数就是元素本身 */
console.log(el);
el.style.background = 'red'
})
/* 全局自定义指令 写全方式 */
Vue.directive('focus', {
/* 当绑定元素插入到DOM中 */
inserted: function (el, bind) {
el.focus();
console.log(bind);
el.style.background = bind.value.background
}
})
new Vue({
el: '.app',
/* 局部的自定义指令 要加s */
directives: {
sty: {
inserted (el, bind) {
el.style.background = bind.value.background;
el.style.color = bind.value.color
}
}
}
})