React 标签与 XML 基础
JSX 是 JavaScript XML 的缩写,它允许我们在 JavaScript 代码中编写类似 HTML 的标记。在神岛 React 中,我们使用 JSX 来创建 UI 组件。
基本标签结构
1. 空标签
空标签是指没有内容的标签,可以使用自闭合形式:
tsx
<box />
<text />
<image />
2. 带内容的标签
带内容的标签需要开始标签和结束标签:
tsx
<box>
<text>Hello World</text>
</box>
3. 嵌套标签
标签可以多层嵌套:
tsx
<box>
<box>
<text>嵌套内容</text>
</box>
</box>
属性使用
1. 基本属性
属性使用驼峰命名法:
tsx
<text style={{ color: "red" }}>红色文本</text>
2. 布尔属性
布尔属性可以简写:
tsx
<box visible={true} />
// 等同于
<box visible />
3. 动态属性
可以使用 JavaScript 表达式:
tsx
<text style={{ fontSize: size + "px" }}>动态大小</text>
特殊属性
1. style 属性
style 属性用于设置 UI 样式:
tsx
<box
style={{
position: { offset: Vec2.create({ x: 100, y: 100 }) },
size: { width: 200, height: 200 },
}}
>
<text>居中文本</text>
</box>
2. onClick 事件
处理点击事件:
tsx
<text onClick={() => console.log("点击了文本")}>可点击文本</text>
最佳实践
标签命名
- 使用语义化的标签名
- 保持标签层次清晰
- 避免过度嵌套
属性使用
- 合理使用 style 属性
- 注意属性命名规范
- 保持属性简洁
代码组织
- 相关标签放在一起
- 使用适当的缩进
- 添加必要的注释
JSX 表达式语法
在 JSX 中,我们使用两种不同的括号语法:{ {} }
和 {}
,它们有不同的用途:
1. 单花括号 {}
单花括号用于插入 JavaScript 表达式,包括:
- 变量
- 函数调用
- 算术运算
- 条件表达式
tsx
// 变量
<text>{name}</text>
// 表达式
<text>{count + 1}</text>
// 函数调用
<text>{formatName(user)}</text>
// 条件渲染
<text>{isLoggedIn ? '已登录' : '未登录'}</text>
2. 双花括号
双花括号专门用于 style 属性,表示一个 JavaScript 对象:
- 外层
{}
表示这是一个 JavaScript 表达式 - 内层
{}
表示这是一个对象字面量
tsx
// style 属性使用双花括号
<text style={{
textColor: Vec3.create({ r: 96, g: 212, b: 92 }),
textFontSize: 20
}}>
样式文本
</text>
// 错误示例:使用单花括号
<text style={textColor: Vec3.create({ r: 96, g: 212, b: 92 })}> // 语法错误
// 正确示例:使用双花括号
<text style={{ textColor: Vec3.create({ r: 255, g: 0, b: 0 }) }}>
红色文本
</text>
3. 注意事项
- style 属性必须使用双花括号
tsx
// 正确
<text style={{ textColor: color }}>
// 错误
<text style={textColor: color}>
- 其他属性使用单花括号
tsx
// 正确
<text visible={isVisible}>
// 错误
<text visible={{isVisible}}>
- 嵌套对象需要使用双花括号
tsx
// 正确
<text style={{
position: { offset: Vec2.create({ x: 100, y: 100 }) }
}}>
// 错误
<text style={position: { offset: Vec2.create({ x: 100, y: 100 }) }}>
示例代码
tsx
import React from "@dao3fun/react";
function UserInfo() {
return (
<box
style={{
position: { offset: Vec2.create({ x: 100, y: 100 }) },
}}
>
<text style={{ textFontSize: 20 }}>用户信息</text>
<text
style={{
position: { offset: Vec2.create({ x: 0, y: 30 }) },
textColor: Vec3.create({ r: 96, g: 212, b: 92 }),
}}
>
用户名:张三
</text>
<text
style={{
position: { offset: Vec2.create({ x: 0, y: 60 }) },
textColor: Vec3.create({ r: 212, g: 162, b: 92 }),
}}
>
等级:10
</text>
</box>
);
}
React.render(<UserInfo />, ui);
效果:
注意事项
- 所有标签必须正确闭合
- 属性值使用驼峰命名法
- style 属性中的值需要符合神岛 UI API 规范
- 事件处理函数使用箭头函数
- 复杂的样式建议抽离为常量