React is an engine for building composable user interfaces using JavaScript and (optionally)
- 组件
- JSX
- Vitual DOM
XML.
一、 JSX
1. JSX 不是必须的
JSX 编译器把类似 HTML 的写法转换成原生的 JavaScript 方法,并且会将传入的属性转化为对应的对象。它类似与一种语法糖,把标签类型的写法转换成 React 提供的一个用来创建 ReactElement 的方法。
const MyComponent;
// input JSX,在 JS 中直接写成类似 HTML 的内容,其实它返回的是一个 ReactElement
let app = <h1 title="my title">this is my title </h1>;
// JSX 转换后的结果
let app = React.createElement("h1", {title: "my title"}, "this is my title");
2. HTML 标签与 React 组件
React 可以直接渲染 HTML 类型的标签,也可以渲染 React 组件。
JSX 语法使用第一个字母大小写来区分是一个普通的 HTML 标签还是一个 React 组件。
HTML 类型的标签第一个字母用小写来表示
import React from "react";
// 当一个标签里面为空的时候,可以直接使用自闭和标签。
// class 是 JavaScript 保留关键字,所以如果要写 class 应该替换成 className
let divElement = <div className = "foo"/>;
// 等同于
let divElement = React.createElement("div", {className: "foo"});
React 组件标签第一个字母用大写来表示
import React from "react";
class Headline extends React.Component {
...
render() {
// 直接 return JSX 语法
return <h1>Hello React</h1>
}
}
let headline = <Headline />;
// 等同于
let headline = React.createElement(Headline);
3. JavaScript 表达式
在给组件传入属性的时候,有一大部分的情况是要传入一个 JavaScript 对象的,规则是当遇到{}这个表达式,就把里面的代码当作 JavaScript 代码处理。
属性表达式:
const MyComponent;
let isLoggedIn = true;
let app = <MyComponent name = {isLoggedIn ? "viking" : "please login" } />
子组件表达式:
const MyComponent, LoginForm, Nav;
let isLoggedIn = true;
let app = <MyComponent>{isLoggedIn ? <Nav /> : <LoginForm />}</MyComponent>
布尔类型属性如下:
当省略一个属性的值的时候,JSX 会自动把它的值认为是 true;
let myBuntton = <input type="button" disabled />;
// 等同于
let myButton = <input type="button" disabled="true" />;
4. 注释
在 JSX 中使用注释,沿用 JavaScript 的方法,**需要注意的是,在子组件位置需要用{}括起来。
let component = (
<div>
{/* 这是一个注释 */}
<Headline />
</div>
);
5. JSX 展开属性
一个组件有很多属性
const Profile;
let name = "viking", age = 10, gender = "male";
let component = <Profile name = {name} age = {age} gender = {gender} />
属性过多时不好管理,这是可以使用展开属性
const Profile;
let props = {
name : "viking",
age : 10,
gender : "male"
};
let component = <Profile {...props} />
// 也可以混合使用
let component = <Profile {...props} name="viking2" />
console.log(component.props.name);
// viking2 --后面的属性会覆盖前面的属性