vue中的render函数和过滤器

目录

一、render函数

二、过滤器

  全局注册过滤器

  局部注册过滤器

  过滤器使用

  串联使用

  过滤器js函数,可以传递参数

三、插件

  插件作用:

  开发插件:

  使用插件:


一、render函数

需要js完全编程能力,比模板更接近编译器,编译模板,使用render函数我们可以用js语言来构建DOM,因为vue是虚拟DOM,所以在拿到template模板时也要转译成VNode的函数,而用render函数构建DOM,vue就免去了转译的过程。

render(createElement){
    return createElement(标签名称,{},子节点数组)
  }

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
</head>
<body>
    <div id="app">
        <my-a :level="1">
            hello World
        </my-a>
    </div>
    <script>
        let myA = {
            props:['level'],
            data() {
                return {
                    msg:'myA组件',
                    arrs:[
                        {id:1,name:'terry'},
                        {id:2,name:'larry'},
                        {id:3,name:'ronda'}
                    ]
                }
            },
            // JSX Javascript + xml
            // let a = <div></div>

            // template:`
            //     <div>
            //         myA组件
            //         <h1 v-if='level===1'>
            //             <slot></slot>
            //         <h1>
            //         <h2 v-if='level===2'>
            //             <slot></slot>
            //         <h2>
            //         <h3 v-if='level===3'>
            //             <slot></slot>
            //         <h3>
            //     </div>
            // `
            render(createElement){
                // 创建节点描述   createElement(html标签,{元素属性,配置},[子节点数组])
                // return createElement('h'+this.level,{},[this.$slots.default])
                // return createElement('div',{},this.msg)
                let lis = this.arrs.map(item=>{
                    return createElement('li',{},item.name)
                })

                return createElement('div',{
                    class:['active','error'],
                    style:{
                        color:'pink',
                        fontSize:'28px'
                    }
                },[this.$slots.default,...lis])
            }
        }
        new Vue({
            el:"#app",
            components:{
                'my-a':myA
            },
            data:{

            },
            methods: {
                
            },
        })
    </script>
</body>
</html>

浏览器运行结果如下:

 

二、过滤器

格式化文本,时间都可以使用过滤器,使用在双花括号内部,使用在v-bind表达式

  全局注册过滤器
        // 全局注册过滤器 filter(过滤器名称,格式化函数)
        Vue.filter('capitalize', function (val,a,b) {
            console.log(val,a,b,'需要格式化文本');
            return val.charAt(0).toUpperCase() + val.slice(1)
        })
  局部注册过滤器
        new Vue({
            el: "#app",
            // 局部注册过滤器
            filters: {
                'fmtDate'(val){
                    return moment(val).format('YYYY-MMMM-Do HH:mm:ss a')
                },
                'lowerCase'(val){
                    return val.charAt(0).toLowerCase() + val.slice(1)
                }
            },
            data: {
                msg: 'hello vue',
                time:new Date().getTime()
            },
            methods: {

            },
        })
  过滤器使用
        <!-- 过滤器: 常见文本格式化 时间格式化 -->
        <!-- 使用: 格式化文本 | 过滤器名称 -->
        {{msg | capitalize}}
  串联使用
        <!-- 过滤器串联使用 -->
        {{msg | capitalize | lowerCase}}
        <div v-bind:title="msg | capitalize">我是div</div>
        {{time | fmtDate}}
  过滤器js函数,可以传递参数
        <!-- 使用过滤器的同时传递参数 -->
        {{msg | capitalize('hello',{name:'terry'})}}

三、插件

        添加Vue的全局功能,开发插件必须暴露install方法

  插件作用:

        为Vue添加全局功能(指令、过滤器、全局方法、实例方法、第三方库)

  开发插件:
        // 开发插件 ----> 插件暴露install方法
        let myPlugin = {
            install(Vue,options){
                // console.log(Vue,options);
                // Vue构造函数全局方法 静态方法
                Vue.Method = function(val){
                    alert(val)
                }
                // 全局注册自定义指令
                Vue.directive('focus',{
                    inserted(el){
                        el.focus()
                    }
                })
                // 全局注册过滤器
                Vue.filter('capitaliza',function(val){
                    return val.charAt(0).toUpperCase() + val.slice(1)
                })
                // 注册实例方法
                Vue.prototype.$message = function(val){
                    alert(val)
                }
            }
        }

  使用插件:
        // 使用插件 ----> 在new Vue之前调用
        Vue.use(myPlugin)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值