利用vue的render函数写jsx并且进行封装

jsx的美观

说到jsx大家都会想到React

React 是一个声明式,高效且灵活的用于构建用户界面的 JavaScript 库。使用 React 可以将一些简短、独立的代码片段组合成复杂的 UI 界面,这些代码片段被称作“组件”。
声明式 、 组件化 、 一次学习,随处编写

Vue也可以通过编写组件来进行复用 ,但是Vue也可以通过编写jsx文件来创造组件,并且在我看来jsx编写的代码更加直观
以下就是我最近学到的用jsx编写Vue的组件

import moment from 'moment'


const styles = {
    recordCard: {
        padding: '0.45rem 0',
        display: 'flex',
        backgroundColor: '#fff',
        borderBottom: '1px solid rgb(202 201 201)'
    },
    timeItem: {
        position: 'relative',
        height: '1.2rem',
        display: 'flex',
        flexDirection: 'column',
        width: '1.1rem',
        color: '#4A6A8E',
        fontSize: '0.24rem',
        borderRight: '1px solid #D8DDE6',
        alignItems: 'center'
    },
    date: {
        fontSize: '0.36rem',
        color: '#1D1F20'
    },
    itemWrapper: {
        position: 'relative',
        height: '1.2rem',
        display: 'flex',
        flexDirection: 'column',
        justifyContent: 'space-between',
        fontSize: '0.24rem'
    },
    timeWrapper: {
        width: '1.1rem',
        color: '#4A6A8E',
        alignItems: 'center',
        borderRight: '1px solid #D8DDE6'
    },
    rightContent: {
        flex: 1,
        padding: '0 0.44rem 0 0.2rem',
        overflow: 'hidden',
        color: '#4A4A4A'
    },
    extra: {
        position: 'absolute',
        right: '0.44rem',
        top: 0,
        fontSize: '0.24rem'
    }
}

export default {
    name: 'detail-card',
    props: {
        time: {
            type: [Number, String],
            required: true
        },
        username: {
            type: String
        },
        mobile: String,
        getClick: {
            type: Function,
            require: Object
        }
    },
    computed: {
        momentDate() {
            return moment(this.time)
        },
        isDateInvalid() {
            return !this.time || !this.momentDate.isValid()
        },
        month() {
            return this.isDateInvalid ? '' : this.momentDate.format('M') + '月'
        },
        day() {
            return this.isDateInvalid ? '' : this.momentDate.format('DD')
        },
        dayTime() {
            return this.isDateInvalid ? '' : this.momentDate.format('HH:mm')
        }

    },
    render() {
        const { $slots, month, day, dayTime, getClick } = this
        return (
            <div style={styles.recordCard} onClick={getClick}>
                <div style={styles.timeItem}>
                    <span>{month}</span>
                    <span style={styles.date}>{day}</span>
                    <span>{dayTime}</span>
                </div>
                <div style={[styles.itemWrapper, styles.rightContent]}>
                    <div style={{ minHeight: '0.33rem', display: 'flex' }}>{$slots.top}</div>
                    {$slots.middle && <div style={{ minHeight: '0.33rem' }}>{$slots.middle}</div>}
                    <div style={{ minHeight: '0.33rem' }}>{$slots.bottom}</div>
                    <div style={{ ...styles.extra, textAlign: 'right' }} >{$slots.extra}</div>
                </div>
            </div>
        )
    }
}

以下是对于这个封装的组件使用

const style = {
    span: {
        fontSize: "0.28rem",
        color: "#1D1F20",
    },
    middle: {
        fontSize: "0.24rem",
        color: "#666",
        display: "flex",
    },
    bottom: { fontSize: "0.24rem", color: "#666", display: "flex" },
    extra: {
        position: "absolute",
        right: "0.3rem",
        top: "0.8rem",
        color: "rgb(74, 106, 142)",
    },
}
import detailCard from '@/components/detail-card/index'
import moment from 'moment'
export default {
    component: {
        detailCard
    },
    data() {
        return {
            userList: [
                {
                    time: new Date().valueOf()
                },
                {
                    time: new Date().valueOf()
                },
                {
                    time: new Date().valueOf()
                },
                {
                    time: new Date().valueOf()
                },
                {
                    time: new Date().valueOf()
                },
            ]
        }
    },
    methods: {
        getClick() {
            console.log(8888888)
        }
    },
    render() {
        return (<div style={{ height: '100vh' }}>
            {this.userList.map(item => {
                return <detailCard getClick={this.getClick} time={item.time}>
                    <span slot="extra">xqq</span>
                    <div slot="top">
                        <span style={style.span}>管小欣</span>
                        {'17386377098'}
                    </div>
                    <div slot="middle">
                        <span style={style.middle}>试驾车型:测试</span>
                    </div >
                    <div slot="bottom">
                        <span style={style.bottom}
                        >试驾时间:{moment(new Date()).format("YYYY-MM-DD HH:mm")}
                            <div slot="extra" > </div>
                        </span>
                    </div >
                </detailCard>
            })}
        </div>)
    }
}

实现的效果图如下:
在这里插入图片描述
React

React被认为是视图层的框架是因为它是基于组件的,一切都是组件,而组件就是渲染页面的基础。不论组件中包含的jsx,methods,state,props,都是属于组件内部的

以上俩段代码复制到网页上就可以直接调试,一起来试试用jsx来编写Vue组件吧

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vuerender 函数Vue.js 中一个非常重要的概念。它是用来描述组件如何渲染的函数。在 Vue 中,我们可以使用模板语法来编组件的渲染逻辑,也可以使用 render 函数来编。 使用 render 函数,你可以直接返回一个虚拟 DOM 对象,描述组件的结构和行为。这个函数接收一个参数,通常命名为 h(代表 createElement),它是一个用于创建 VNode(虚拟节点)的函数。 在 render 函数中,你可以通过调用 h 函数来创建 VNode,然后返回一个或多个 VNode 组成的树形结构。VNode 是对真实 DOM 的一种抽象表示,它包含了节点的标签名、属性、子节点等信息。 以下是一个简单的例子,演示了如何使用 render 函数创建一个简单的 Vue 组件: ```javascript // 定义一个组件 const MyComponent = { render(h) { return h('div', { class: 'container' }, [ h('h1', {}, 'Hello, Vue!'), h('p', {}, 'This is a Vue component.') ]) } } // 使用组件 new Vue({ el: '#app', render: h => h(MyComponent) }) ``` 这个例子中,我们定义了一个名为 MyComponent 的组件,在 render 函数中返回了一个包含 h1 和 p 标签的 div 元素。在 new Vue 的时候,我们将 render 函数指定为 MyComponent,从而将组件渲染到具有 id 为 app 的元素中。 通过使用 render 函数,你可以更灵活地控制组件的渲染逻辑,实现更高级的功能。它提供了一种编程式的方式来构建组件,而不仅仅局限于模板语法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值