美文网首页
Render渲染函数和JSX

Render渲染函数和JSX

作者: 幻影翔 | 来源:发表于2019-12-19 00:38 被阅读0次

render函数

h( 元素,属性,值 ) 中 h 不能少

// render 包含下main相关属性
 render: h => {
        return h(CountTo, {
            'class':[],
            attrs: {},
            style: {},
            props: {
                endVal: 200
            },
            // domProps: {
            //  innerHTML: '123'
            // },
            on: {
                'on-animation-end': (val) => {
                    console.log('end')
                }
            },
            nativeOn: {
                'click': () => {
                    console.log('click !')
                }
            },
            directives: [],
            scopedSlots: {},
            slot: '',
            key: '',
            ref: ''
        })
    }

使用

<div>
    <ul @click="handleClick">
        <li v-for="(item, index) in list" :key="`list_item_${index}`">{{ item.name }}</li>
    </ul>
</div>

// 将它转成render函数
    render: h => h('div', [
        h('ul', {
            on: {
                'click': event => {
                    console.log(event)
                }
            }
        }, getEleArr(h))
    ])

let list = [{name: 'jack1'},{name: 'jack3'}]
const getEleArr = (h) => {
    return list.map((item,index) => h('li',{
        on: {
            'click': event => {
                console.log(event)
                event.stopPropagation()
            }
        },
        key: `list_item_${index}`
    },item.name))
}

list组件中调用

<template>
    <ul>
        <li v-for="(item, index) in list" :key="`item_${index}`">
            <span v-if="!render">{{ item.name }}</span>
            <render-dom v-else :render-func="render" :name="item.name"></render-dom>
        </li>
    </ul>
</template>
<script>
import RenderDom from '_c/render-dom'
export default {
    name: 'List',
    components: {
        RenderDom
    },
    props: {
        list: {
            type: Array,
            default: () => []
        },
        render: {
            type: Function,
            default: () => {}
        }
    }
}
</script>

函数式组件

定义函数式组件

export default  {
    functional: true,  // true时没有状态
    props: {
        name: String,
        renderFunc: Function // 用户自定义的函数
    },
    render: (h, ctx) => {
        return ctx.props.renderFunc(h, ctx.props.name)
    }
}

页面使用

<template>
    <div>
        <list :list="list" :render="renderFunc"></list>
    </div>
</template>
<script>
import List from '_c/list'
export default {
    data () {
        return {
            list: [
                { name: 'jack1'},
                { name: 'jack2'}
            ]
        }
    },
    components: {
        List
    },
    methods: {
        renderFunc (h, name) {
            return h('i', {
                style: {
                    color: 'pink'
                }
            }, name)
        }
    }
}
</script>

JSX

  • 直接使用{ } 包裹 ,不需要 " "双引号了
  • 绑定事件不需要 :
  • on-actionName on-自定义事件名
  • nativeOn-click 给原生标签加事件,即给外层的div加点击事件
  • 使用封装组件的时候,使用的标签名字就是导入的名字,不需要改变,例如 CountTo
  • JSX里面使用的组件不需要在 components中定义,template使用的需要定义
  • render 传参数
    this.函数名.bind(this, 参数)
    <div>
        <list :list="list"  :render="renderFunc"></list>
    </div>
</template>
<script>
import List from '_c/list'
import CountTo from '_c/count-to'
export default {
    data () {
        return {
            list: [
                { number: 100},
                { number: 200}
            ]
        }
    },
    components: {
        List
    },
    methods: {
        renderFunc (h, number) {
            return (
                // 直接写标签,注意用 { } 包裹
                // 事件使用on-actionName
                <CountTo nativeOn-click={this.handleClick} on-on-animation-end={this.handleEnd} endVal={number} style={{color:'pink'}}></CountTo>
            )
        },
        handleClick (event) {
            console.log(event)
        },
        handleEnd () {
            console.log("end")
        }
    }
}
</script>

常用指令变化

.stop => event.stopPropagation()  // 阻止冒泡事件
.prevent  => event.preventDefault()  // 阻止鼠标默认行为

作用域插槽

// 给 slot 绑定一个属性
<slot :number="item.number"></slot>

// 使用,定义一个属性count ,然后可以直接使用count属性对象中的值
<count-to slot-scope="count" :end-val="count.number"></count-to>

相关文章

  • Render渲染函数和JSX

    render函数 h( 元素,属性,值 ) 中 h 不能少 使用 list组件中调用 函数式组件 定义函数式组件 ...

  • Vue中的render渲染函数

    Vue中的render渲染函数 render函数只支持jsx写法创建虚拟Dom节点。vue组件中的template...

  • vue 渲染函数 & JSX

    渲染函数 render 通过渲染函数渲染组件 渲染后: JSX 通过以上方式创建虚拟DOM,语法比较繁琐。可以使用...

  • Vue render函数详解

    渲染函数 & JSX 基础[https://cn.vuejs.org/v2/guide/render-functi...

  • ###VUE下

    渲染函数和jsx 在vue中我们可以不用template来指定组件的模板,而是用render函数来创建虚拟dom结...

  • 深入理解react笔记

    1. render函数没有渲染的作用,只是将jsx转译成一个react.createElement函数。 2.st...

  • react-demos

    [2018.08.08] Render JSXReactDOM.render()讲jsx渲染成HTML并插入到指定...

  • 模板文法

    1.底层实现上,vue是将模板编译成 虚拟dom渲染函数。 2.可以用jsx编写render函数,来替代templ...

  • Vue 单文件 render 函数的 JSX 语法实现 Elem

    本文用来记录我自己学习如何在 Vue 单文件中通过 JSX 语法实现 render 函数的渲染,总共涉及到了以下知...

  • React次级渲染遇到的问题 2019-09-02

    一、次级渲染 什么是次级渲染?我们总是希望render返回的jsx足够小,以便于阅读理解,于是将jsx使用js f...

网友评论

      本文标题:Render渲染函数和JSX

      本文链接:https://www.haomeiwen.com/subject/fdqynctx.html