Vue的组件,过滤器,自定义指令以及v-if

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

                    }

                }

            }

        })

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容