UNPKG

6.27 kBMarkdownView Raw
1# JSX
2
3React发明了JSX, 可以简单地理解它是一种在JS中编写与XML类似的语言。通过JSX来声明组件的属性,类型与结果,并且通过`{}`插值,套嵌JS逻辑与子级的JSX。
4
5### JSX的特点:
6
71. 类XML语法容易接受,结构清晰
82. 增强JS语义
93. 抽象程度高,屏蔽DOM操作,跨平台
104. 代码模块化
11
12
13我们从最简单的一个helloworld开始:
14```jsx
15<h1>Hello, world!</h1>
16```
17
18script标签里面的内容实际会被编译成
19
20```javascript
21React.createElement('h1', null, 'Hello, world!');
22```
23
24又如
25```jsx
26var root =(
27 <ul className="my-list">
28 <li>First Text Content</li>
29 <li>Second Text Content</li>
30 </ul>
31);
32```
33
34会被编译成
35```javascript
36var root = React.createElement('ul', { className: 'my-list' },
37 React.createElement('li', null, 'First Text Content'),
38 React.createElement('li', null, 'Second Text Content')
39);
40```
41
42### JSX语法介绍
43
44`{}`插值是让JSX区别普通HTML的一个重要特性,只有三个地方可以使用它。可以放属性名的地方,属性等于号之后的位置及innerHTML之间。
45
461.**可以放属性名的地方**, 这里只能使用`JSXSpreadAttribute`(延伸属性), 换言之,括号内必须带三个点号
47
48```jsx
49var props = {};
50props.foo = x;
51props.bar = y;
52var component = <Component {...props} />;
53```
54
552.**属性等于号之后的位置**, JSX的属性值必须用引号括起来,当你将引号改成花括号,它里面就可以使用JSX变量了。相当于其他框架的绑定属性或指令。需要说明一下,HTML的固有属性必须使用JS形式,保持驼峰风格,如class要用className代替,for要用htmlFor代替,tabindex要用tabIndex代替,colspan要用colSpan代替。
56
57```jsx
58<div tabIndex={this.props.a} />
59```
60花括号里面可以使用三元表达式
61```jsx
62var person = <Person name={ window.isLoggedIn ? window.name : '' } />;
63```
64会编译成
65```javascript
66var person = React.createElement(
67 Person,
68 {name: window.isLoggedIn ? window.name : ''}
69);
70```
71
72
733.**innerHTML**
74
75```jsx
76<div>xxx{111}yyy</div>
77```
78
79这个会编译成, `相邻的字任串或数字会合并成一个字符串``布尔,null, undefined会被忽略掉`
80```javascript
81React.createElement('div', null, "xxx111yyy")
82```
83
84在innerHTML里面,我们可以使用数组或数组的map方法生成一个新数组的方法,为当前父元素添加一堆子元素。
85
86```jsx
87var ul = (
88 <ul className="unstyled">
89 {
90 this.todoList.todos.map(function (todo) {
91 return (
92 <li>
93 <input type="checkbox" checked={todo.done}>
94 <span className={'done-' + todo.done}>{todo.text}</span>
95 </li>
96 );
97 })
98 }
99 </ul>
100);
101```
102
103### JSX中使用样式
104
105在JSX中使用样式和真实的样式也很类似,通过style属性来定义,但和真实DOM不同的是,`属性值不能是字符串而必须为对象`。
106```jsx
107<div style={{color: '#ff0000', fontSize: '14px'}}>Hello World.</div>
108```
109
110或者
111```jsx
112var style = {
113 color: '#ff0000',
114 fontSize: '14px'
115};
116
117var node = <div style={style}>HelloWorld.</div>;
118```
119
120要明确记住,{}里面是JS代码,这里传进去的是标准的JS对象。在JSX中可以使用所有的样式,基本上属性名的转换规范就是将其写成驼峰写法,例如“background-color”变为“backgroundColor”, “font-size”变为“fontSize”,这和标准的JavaScript操作DOM样式的API是一致的。
121
122### HTML转义
123
124在组件内部添加html代码,并将html代码渲染到页面上。React默认会进行HTML的转义,避免XSS攻击,
125如果要不转义,可以使用dangerouslySetInnerHTML属性。dangerouslySetInnerHTML要求对应一个对象,里面有一个叫__html的字符串。React故意搞得这么难写,目的让大家少点用它。
126
127```jsx
128<div dangerouslySetInnerHTML={{__html: '<strong>content</strong>'}}></div>
129```
130
131注意:JSX里面br,input, hr等标签必须自闭合,如`<br>`必须写成`<br />`
132 并且使用了dangerouslySetInnerHTML
133
134### 属性的定义
135
136JSX是严格区分固有属性与自定义属性, 固有属性是指元素原形链上就已存在的属性,比如id, title, className, htmlFor, style,colSpan。这些属性是严格区分大小写。并且对属性值也有要求。
137
138固有属性根据其值的类型,可以分为布尔属性与字符串属性。布尔属性一般出现在表单元素与A,script等标签上,如disabled, readOnly, selected, checked等等。布尔属性时,大家在使用时,值必须是布尔
139```jsx
140<input type='radio' checked={true} />
141
142```
143
144
145字符串属性也比较常见:
146```
147value,id,title,alt,htmlFor,longDesc,className
148```
149
150 还有一些不规则的属性(不需要刻意记,只要记住上面两种就是)
151 ```
152 accessKey,bgColor,cellPadding,cellSpacing,codeBase,codeType,colSpan,dateTime,defaultValue,contentEditable,frameBorder,maxLength,marginWidth,marginHeight,rowSpan,tabIndex,useMap,vSpace,valueType,vAlign
153 ```
154
155 而自定义属性,则是用户随便设置的。
156
157
158### 如何自定义组件
159在 YDoc 新建组件是非常简单的,第一步在 docs 目录下新建 _components 目录
160假设我们要新建一个 Demo 组件,可以新建 Demo.jsx 文件(确保文件名第一个字母大写),文件内容如下:
161
162
163一般来说,我们可以通过标签名的第一个字母是大写还是小写来识别组件与普通标签。
164
165```jsx
166 <p>
167 Hello, <input type="text" placeholder="Your name here" />!
168 It is {props.date}
169 </p>
170```
171
172### 如何引用自定义组件
173假设有一个 Demo2 组件,想引用 Demo 组件,可在 Demo2.jsx 文件写入以下示例代码引入:
174
175```jsx
176<Demo2 date="2018">
177
178```
179
180### 自定义页面变量
181如果使用 js 自定义页面变量,将会非常难用和不优雅,YDoc 参考了开源工具 [gray-matter](https://github.com/jonschlinkert/gray-matter) 在页面注入 YAML 方案。
182
183```html
184---
185title: Hello
186slug: home
187---
188<h1 >{title}, {slug}</h1>
189```
190
191### 系统内部组件
192系统内置了如下的组件,请尽量避免跟系统组件重名,因为一旦重名,将会覆盖系统的原有组件。
193
194* Content
195* Footer
196* Head
197* Header
198* Homepage
199* Hook
200* Layout
201* Logo
202* Script
203* Summary
204
\No newline at end of file