介绍一下JSX
JSX 简介
JSX是一种Javascript的语法扩展,JSX
= Javascript
+ XML
,即在Javascript
里面写XML
,因为JSX
的这个特性,所以他即具备了Javascript
的灵活性,同时又兼具html
的语义化和直观性。
应用场景
为了让大家更方便的去理解JSX
的作用及用法,我先为大家罗列了几个可能会用到JSX
的应用场景。
在消息框内添加html
在开发过程中,经常会用到消息框,使用消息框可能的一种写法是这样的
Message.alert({ messge: '确定要删除?', type: 'warning' })
但是有时候产品或UI希望message
可以自定义一些样式,这时候你可能就需要让Message.alert
支持JSX
了(当然也可以使用插槽/html
等方式解决)
Message.alert({ // 此处使用了JSX messge: <div>确定要删除<span style="color:red">学习子君Vue系列文章</span>的笔记?</div>, type: 'warning' })
函数式组件
虽然在Vue.2.5
之后,函数式组件也可以使用模板语法,但使用JSX
可能会更方便一些(个人理解)
export default { // 通过配置functional属性指定组件为函数式组件 functional: true, /** * 渲染函数 * @param {*} h * @param {*} context 函数式组件没有this, props, slots等都在context上面挂着 */ render(h, context) { const { props } = context if (props.avatar) { return <img src={props.avatar}></img> } return <img src="default-avatar.png"></img> } }
一个表单的需求
为了方便快速开发管理系统,我对所使用的UI库中的表单进行了二次封装,封装之后的效果如下(仅供参考):
<template> <custom-form v-model="formData" :fields="fields" /> </template> <script> export default { data() { return { formData: {}, fields: Object.freeze([ { label: '字段1', props: 'field1', type: 'input' }, { label: '字段2', props: 'field2', type: 'number' } ]) } } } </script>
这样封装之后,定义表单时,只需要定义简单的
{ label: '字段2', props: 'field2', type: 'number', // 会渲染到表单元素后面 renderSuffix() { return <button onClick={this.$_handleSelect}>选择</button> } }
其他一些场景
比如我们一条数据需要根据状态不同,定义不同的展现方式,这时候你可能会想到用策略模式,这时候如果将每一个策略都写成一个JSX
,那么就不需要针对每一个策略定义一个单文件组件了。当然如果你说,我就喜欢用JSX
,那么所有的场景你都可以用。