Vue函数式组件个人理解

Vue官方文档的demo总是会省略很多东西,对于我们这样的小萌新十分不友好啊喂。函数式组件这块儿(链接https://cn.vuejs.org/v2/guide/render-function.html#函数式组件)这个demo啊,并没有实现什么实际的东西,还是需要自己去编写。我把它编辑好了,大家可以参考一下。

首先,html这块儿:

<div id="app">
    <smart-list :items=items></smart-list>
</div>

vue实例名为app,组件名为smart-list,这个组件可以根据我绑定的items来更改对应的不同内容,具体的见下面的js部分:


 //当父组件传过来的是空items时
    var EmptyList = {template: '<p>Empty list</p>'};
    //当父组件传来的items元素为对象类型时
    var TableList = 'ul'
    // 当父组件定义了isOrdered变量且为true
    var UnorderedList = 'ul'

    //定义组件
    Vue.component('smart-list', {
        //标记为函数式组件
        functional: true,

        //render函数
        render: function (createElement, context) {
            // console.log(context)//若不理解可以打印出来context来看看里面都有些什么东西

            //规定组件的渲染规则
            function appropriateListComp() {
                //获取父组件传来的数据
                var items = context.props.items;

                //若空,则返回前面定义的emptylist
                if (items.length === 0) return EmptyList;
                //若为对象
                if (typeof items[0] === 'object') return TableList;
                //其他
                return UnorderedList
            }

            //生成模板
            return createElement(
                //模板标记为渲染规则函数返回值
                appropriateListComp(),
                //模板子元素,返回一个数组
                Array.apply(null, {length: context.props.items.length}).map(function (value, index) {
                    return createElement('li',context.props.items[index].name)
                })
            )
        },
        props: {
            items: {
                type: Array,
                required: true
            },
            isOrdered: Boolean
        }
    });
    new Vue({
        el: '#app',
        data:{
            items:[
                {
                    name:'a',
                    id:0
                },
                {
                    name:'b',
                    id:1
                },
                {
                    name:'c',
                    id:2
                }
            ]
        }
    })

这里我们例子中的items数组中的元素为对象类型。

这里总共创建了3个模板子元素<li>

最终浏览器中的渲染结果:

<div id="app">
    <ul>
        <li>a</li>
        <li>b</li>
        <li>c</li>
    </ul>
</div>


以上。

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值