在Vue中使用JSX作为render

ant-design-vue开源了一段时间后,收到了一些反馈,尤其是Form组件上线后,很多用户对JSX的使用感到迷惑和不习惯,为此专门介绍下Vue JSX的使用姿势及注意事项。

Form组件的自动收集校验功能需要在JSX下使用,当然如果不需要自动收集校验,你依然可以使用template

 

Vue 推荐在绝大多数情况下使用 template 来创建你的 HTML。然而在一些场景中,你真的需要 JavaScript 的完全编程的能力,就需要使用 render 函数,它比 template 更接近编译器。但是复杂的render函数书写异常痛苦,好在官方提供了一个 Babel 插件,可以将更接近于模板语法的JSX转译成JavaScript。

 

使用过React的同学对JSX肯定不陌生,但是Vue的JSX写法和React的还是有一些区别。

React中父子之间传递的所有数据都是属性,即所有数据均挂载在`props`下(style, className, children, value, onChange等等)。

 

Vue则不然,仅仅属性就有三种:组件属性props,普通html属性attrs,Dom属性domProps

接下来我们通过一个示例来详细解释他们的区别:本文代码可在

Vue 3 中,JSX使用Vue 2 有所不同,尤其是在 render 函数的编写方式上。Vue 3 支持通过 `@vue/babel-plugin-jsx` 插件来实现 JSX 语法的支持,并且在编写 render 函数时,开发者可以使用更接近 React 的方式来构建组件的 Virtual DOM 结构。以下是一些关键点示例,展示了如何在 Vue 3 的 JSX使用 render 函数。 ### render 函数的基本结构 在 Vue 3 中,render 函数通常用于自定义组件的渲染逻辑。使用 JSX 时,render 函数的写法与 Vue 2 类似,但需要引入 `h` 函数(即 `createVNode`)作为参数传递给 render 函数。例如: ```javascript import { defineComponent, h } from 'vue' const MyComponent = defineComponent({ render(h) { return <div>Hello, JSX in Vue 3!</div> } }) ``` 在这个例子中,`h` 是 `createVNode` 的别名,用于创建虚拟节点。这种方式使得 render 函数中的 JSX 语法更加直观简洁。 ### 使用组件 props 在 JSX使用组件时,可以直接通过标签名来引用已定义的组件。例如,如果有一个 `Button` 组件,可以在 render 函数中这样使用: ```javascript import { defineComponent, h } from 'vue' import Button from './Button.vue' const MyComponent = defineComponent({ render(h) { return <Button onClick={this.handleClick}>Click me</Button> }, methods: { handleClick() { console.log('Button clicked') } } }) ``` 在这里,`onClick` 是一个事件监听器,绑定到 `handleClick` 方法上。这种写法类似于 HTML 标签的属性传递方式,但在 Vue 3 中,事件监听器需要使用 `on` 前缀。 ### 动态渲染内容 在 render 函数中,可以动态地渲染内容,例如根据数据状态来决定显示什么内容。以下是一个简单的例子,展示了如何根据组件的状态来渲染不同的内容: ```javascript import { defineComponent, h } from 'vue' const MyComponent = defineComponent({ data() { return { showText: true } }, render(h) { return ( <div> {this.showText ? <p>显示文本</p> : <p>隐藏文本</p>} </div> ) } }) ``` 在这个例子中,`showText` 是一个布尔值,决定了显示哪一段文字。这种条件渲染的方式非常灵活,适用于各种动态内容的场景。 ### 函数式组件 Vue 3 还支持函数式组件,这种组件没有自己的状态,只依赖于传入的 props。函数式组件的 render 函数可以直接返回 JSX 内容。以下是一个简单的函数式组件示例: ```javascript import { defineComponent, h } from 'vue' const FunctionalComponent = defineComponent((props, { slots }) => { return () => ( <div> <h1>Functional Component</h1> {slots.default ? slots.default() : <p>No slot content provided</p>} </div> ) }) ``` 在这个例子中,`FunctionalComponent` 是一个函数式组件,它接收 `props` `slots` 作为参数,并返回一个 render 函数。这个 render 函数返回 JSX 内容,其中包含了默认插槽的内容。 ### 总结 在 Vue 3 中,使用 JSX 编写 render 函数可以显著提高代码的可读性可维护性。通过引入 `h` 函数,开发者可以轻松地创建虚拟节点,并利用 JSX 的语法特性来简化组件的渲染逻辑。无论是在普通组件还是函数式组件中,JSX 都能提供一种更加直观简洁的方式来编写 render 函数。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值