插槽、自定义指令、render函数和过滤器

本文深入探讨了Vue.js中的插槽、自定义指令、render函数及过滤器等高级特性,通过实例展示了这些特性的具体应用方式,帮助开发者更好地掌握Vue.js的进阶用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.插槽

1.1默认插槽/简单插槽

1.2具名插槽

1.3作用域插槽

2.自定义指令

2.1全局自定义指令

2.2局部自定义指令

3.render函数

4.过滤器

4.1全局注册

4.2局部注册


1.插槽

1.1默认插槽/简单插槽

父组件调用子组件提供一个模板

 <div id="app">
        <my-a>我是父组件传递给子组件得模块</my-a>
    </div>
    <script>
        // 定义组件
        let myA = {
            template: `
            <div>
            子组件A
            <slot></slot>    
            </div>
            `
        }
        new Vue({
            components: {
                'my-a': myA
            },
            el: "#app",
        })
    </script>

 

1.2具名插槽

指定父组件提供子组件的模板渲染到指定插槽

 <div id="app">
        <my-a>
            <div>我是父组件传递给子组件的模块</div>
            <template class="header" #header>头部的内容</template>
            <template class="center" v-slot:center>中间得内容</template>
            <template class="footer" #footer>底部得内容</template>
        </my-a>
    </div>
    <script>
        // 定义组件
        let myA = {
            template: `
            <div>
                <slot></slot>
                <hr>
                <slot name='header'></slot>					
				<slot name='center'></slot>					
			
            </div>
            `
        }
        new Vue({
            components: {
                'my-a': myA
            },
            el: "#app",
        })
    </script>

1.3作用域插槽

子组件传递给父组件,使用插槽,父组件获取插槽传递的值。

<div id="app">
        <my-a :arr="arr">
            <template slot-scope="scope">
                {{scope}}
            </template>
        </my-a>
    </div>
    <script>
        // 定义组件
        let myA = {
            props: ['arr'],
            template: `
            <div>			
                <ul>
					<li v-for='item in arr'>
						<slot :subSmg='subMsg' :row='item'></slot>	
					</li>	
				</ul>	
            </div>
            `,
            data() {
                return {
                    subMsg: '我是子组件'
                }
            }
        }
        new Vue({
            components: {
                'my-a': myA
            },
            el: "#app",
            data: {
                arr: [
                    {
                        id: 1,
                        name: 'a',
                    },
                    {
                        id: 2,
                        name: 'b',
                    },
                    {
                        id: 3,
                        name: 'c',
                    }
                ]
            }
        })
    </script>

 

 

2.自定义指令

2.1全局自定义指令

<div id="app">
        用户名:<input type="text" v-focus>
        <input type="text" v-focus="bgColor">

    </div>
    <script>
        // 自定义指令 指令名称 options 配置对象
        // 使输入框聚焦
        Vue.directive('focus', {
            inserted(el, bingding) {
                el.focus();
            },
            // 执行一次性的初始化设置
            bind(el, binding, vnode) {
                el.style.backgroundColor = binding.value

            }
        })
        new Vue({
            el: "#app",
            data: {
                bgColor: 'red',

            },

        })
    </script>

 

2.2局部自定义指令

 <div id="app">
        用户名:<input type="text" v-focus>
        <input type="text" v-myshow="msg">

    </div>
    <script>

        new Vue({
            el: "#app",
            data: {
                msg: 'hello'
            },
            // 局部自定义组件
            directives: {
                // 指令名称:{配置对象}
                'myshow': {
                    inserted(el) {

                    },
                    bind(el, binding, vnode) {
                        el.value = binding.value
                    }
                }
            }

        })
    </script>

3.render函数

render函数跟template一样都是创建html模板的,但是有些场景中使用template实现起来代码冗长繁琐而且有大量重复,render更接近于js编程。

 <div id="app">
        <my-a></my-a>
    </div>
    <script>
        let myA = {
            // render编译模板
            // h- createElement创建节点
            render(h) {
                return h('div', {}, this.msg);

            },
            data() {
                return {
                    msg: "我是一个div标签",
                }
            },
        }
        new Vue({
            components: {
                'my-a': myA
            },
            el: "#app",
            data: {

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

 

<div id="app">
        <my-a>列表</my-a>
    </div>
    <script>
        let myA = {
            // render编译模板
            // h- createElement创建节点
            render(h) {
                let lis = this.arrs.map(item => {
                    return h('li', {}, item.name)
                })
                return h('ul', {}, [this.$slots.default, ...lis])
            },
            data() {
                return {
                    arrs: [
                        { id: 1, name: 'zhangsan', age: 12 },
                        { id: 2, name: 'lisi', age: 13 },
                        { id: 3, name: 'wangwu', age: 14 },
                    ]
                }
            },
        }
        new Vue({
            components: {
                'my-a': myA
            },
            el: "#app",
            data: {

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

4.过滤器

4.1全局注册

 <script src="https://cdn.jsdelivr.net/npm/vue@2.7.10"></script>
 <script src="https://cdn.bootcdn.net/ajax/libs/moment.js/2.29.4/moment.min.js"></script>


 <div id="app">
        <!-- 过滤器如何使用 | 过滤器 -->
        {{time | fmtDate}}
        <br>
        {{time | fmtTime}}
        <br>
        {{msg | upper}}

    </div>
    <script>
        // 全局注册过滤器 过滤器名称 过滤器格式处理函数
        Vue.filter('fmtDate', function (val) {
            // 将时间戳转换为年月日时分秒 momentjs库
            return moment(val).format('YYYY-MM-DD HH:mm:ss')
        });
        Vue.filter('fmtTime', function (val) {
            // 将时间戳转换为年月日 momentjs库
            return moment(val).format('YYYY-MM-DD')
        });
        new Vue({
            el: "#app",
            data: {
                time: new Date().getTime(),
                msg: "hello"
            },
            methods: {}
        })
    </script>


4.2局部注册

 <div id="app">
        <!-- 过滤器如何使用 | 过滤器 -->
        {{time | fmtData}}
        <br>
        {{msg | upper}}

    </div>
    <script>

        new Vue({
            filters: {
                fmtData(val) {
                    return moment(val).format('MM-DD')
                },
                upper(val) {
                    return val.toUpperCase()
                }
            },
            el: "#app",
            data: {
                time: new Date().getTime(),
                msg: "hello"
            },
            methods: {}
        })
    </script>

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值