- 快速开始
- JSX 介绍
- JSX+ 介绍
- 组件
- 事件处理
- 样式设置
- Hooks 介绍
- Driver 介绍
- 容器差异
- 工程介绍
- 目录结构
- 应用配置
- 应用入口
- 生命周期
- 路由管理
- 简介
- 语法约束
- Hooks
- 多端组件开发
- API 使用
- 静态资源引用
- 项目构建配置
- 页面配置
- 使用原生项目配置文件
- Rax 与小程序代码混用
- FAQ
- 更新日志
- 简介
- 环境变量与 Framework
- Weex Style 支持表
- Weex 组件
- Weex 模块
- 页面降级
- JS Service
- Bundle 解析
- 事件与手势
- 事件通信
- Weex 国际化
- Weex 常见问题
- 简介
- Document
- App Shell
- 代码分离
- 保存至桌面
- 渲染节点快照
- 预加载和预渲染
- 页面保活
- 缓存控制
- PHA 介绍
- 快速开始
- 编码指南
- 数据请求
- FaaS 接入: Now
- FaaS 接入: FC
- 与 Node 应用集成
- 数据请求
- 异步编程
- Rax 错误码
- 简介
- Lite 工程
- 云端一体化工程
- 插件配置
- 插件开发
- 插件简介
- build-plugin-rax-app
- build-plugin-rax-component
- build-plugin-rax-multi-pages
- build-plugin-rax-ssr
- build-plugin-rax-compat-react
- rax-plugin-app 0.1.0 升级
- 调试 Web
- 调试小程序
- 加载性能优化
- 渲染性能优化
- 从 Rax 0.x 升级
- 从 React 迁移
- API 概述
- render
- hydrate
- createPortal
- findDOMNode
- setNativeProps
- getElementById
- unmountComponentAtNode
- createElement
- cloneElement
- createFactory
- isValidElement
- Children
- memo
- Fragment
- createRef
- forwardRef
- useState
- useEffect
- useLayoutEffect
- useContext
- useRef
- useCallback
- useMemo
- useReducer
- useImperativeHandle
- PropTypes
- version
- ActionSheet
- Background
- Keyboard
- Animation
- Transition
- Toast
- Alert
- Confirm
- Loading
- Navigate
- ChooseImage
- Image
- Request
- Network
- File
- Env
- Device
- Clipboard
- AppState
- AsyncStorage
- Accelerometer
- 组件概述
- Text
- View
- TextInput
- Link
- Icon
- Image
- Picture
- Video
- ScrollView
- RecyclerView
- Waterfall
- Embed
- Countdown
- Canvas
- RefreshControl
- Slider
- Modal
- Weex JS Service
- Rax 长列表最佳实践
- 如何减小 Bundle Size
- Rax 0.x 开发工具
- Native 知识扫盲
- iOS 无障碍
- Rax 性能最佳实践
- 从零上手 Rax
- Rax v0.6 组件体验升级
- Rax v0.5 建立服务体系
- Rax v0.3 跨端生态建设
- Rax v0.2 基础能力建设
- 2016 淘宝双促中的 Rax
- Why Rax?
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
JSX+ 介绍
Rax 支持了一种 JSX 扩展语法 JSX+,它能帮助业务开发者更爽更快地书写 JSX。JSX+ 不是一种新的概念,它是 JSX 基础上的扩展指令概念。
为什么需要 JSX+
Rax 使用 JSX 作为标准 DSL 构建了自己的生态,但是 JSX 也存在一定的局限性,所以才有了 JSX+:
- JSX 虽然语法灵活,但是大量的花括号 + JS 语法导致了上下文切换和代码可读性的下降,JSX+ 的指令很好的解决了这个问题
- JSX 本质是 JS 表达式,在运行时阶段才可以计算出真实的 DOM 结构,JSX+ 引入了一部分静态模板特性可以满足编译优化
- 不新创造实体,指令在社区中是已经被广泛接受的概念,对开发者更友好,语法糖的表达更简单
- 统一一套 JSX+ 类似概念的语法规范,减少已存在和潜在的重复建设
如何在 Rax 中使用 JSX+
在 Rax 工程的构建器中我们已经内置了 JSX+ 的支持,所以你可以直接使用下列语法不必关心如何引入。
当然如果你需要在自定义的工程中引入,我们提供了 Rax 官方 DEMO 与 对应的 Babel 插件,你可以点击对应链接查看细节。
以下是 JSX+ 1.0 规范已有的指令列表:
1. 条件判断
语法:
<View x-if={condition}>Hello</View>
<View x-elseif={anotherCondition}></View>
<View x-else>NothingElse</View>
注: x-elseif
可以多次出现,但是顺序必须是 x-if -> x-elseif -> x-else,且这些节点是兄弟节点关系,如顺序错误则指令被忽略。
2. 循环列表
语法:
{/* Array or Plain Object*/}
<tag x-for={item in foo}>{item}</tag>
<tag x-for={(item, key) in foo}>{key}: {item}</tag>
说明:
- 若循环对象为数组,key 表示循环索引,其类型为 Number。
- 当
x-for
与x-if
同时作用在同一节点上时,循环优先级大于条件,即循环的item
和index
可以在子条件判断中使用。
3. 单次渲染
仅在首次渲染时会触发 createElement
并将其引用缓存,re-render 时直接复用缓存,用于提高不带绑定节点渲染效率和 Diff 性能。
语法:
<p x-memo>this paragragh {mesasge} content will not change.</p>
4. 插槽指令
类似 WebComponents 的 slot 概念,并提供插槽作用域。
语法:
<tag x-slot:slotName="slotScope" />
示例:
// Example
<Waterfall>
<view x-slot:header>header</view>
<view x-slot:item="props">{props.index}: {props.item}</view>
<view x-slot:footer>footer</view>
</Waterfall>
<slot name="header" /> // 槽位
对比传统 JSX:
<Waterfall
renderHeader={() => (<view>header</view>)}
renderFooter={() => (<view>footer</view>)}
renderItem={(item, index) => (<view>{index}: {item}</view>}
/>
对比小程序:
<Waterfall>
<view slot="header">header</view>
<view slot="item" slot-scope="props">{props.index}: {props.item}</view>
<view slot="footer">footer</view>
</Waterfall>
5. Fragment 组件
提供空组件,不产生 UI,提供绑定 x-if
x-for
x-slot
指令。
使用:
<Fragment />
6. 类名绑定
语法:
<div x-class={{ item: true, active: val }} />
参考实现:
<div className={classnames({ item: true, active: val})} />
classnames
方法能力参考同名 npm 包。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论