JSX
先看以下代码:
const element = <h1>Hello, world!</h1>;
- 这种在JS中写标签的语法叫JSX-JavaScript XML
- 它既不是字符串也不是HTML
- 本质上是 React.createElement ( ) 的语法糖,最终产生一个JS对象
- 这些对象被称为 “React元素”
- 因为它产生一个JS对象,因此可以通过引号或者大括号来指定属性
const element = <div tabIndex="0"></div>;
const element = <img src={user.avatarUrl}></img>;
基本语法规则:
- 遇到< >开头的代码,以标签的语法解析:html同名标签转换为html同名元素,其他标签则需要特别解析
- 遇到{ }开头的代码,以JS语法解析,且标签中的 js 表达式必须用 { } 包含
元素
- 元素描述了你在屏幕上想看到的内容
- 与浏览器的 DOM 元素不同,React 元素是创建开销极小的普通对象
- React通过读取这些对象,然后使用它们来构建 DOM 以及保持随时更新
- React元素是不可变对象。一旦被创建,就无法更改他的子元素或者属性
- 想要更新UI唯一的方式是创建一个全新的元素,并将其传入 ReactDOM.render ( )
- 渲染元素:
想要将一个 React 元素渲染到根 DOM 节点中,只需要把它传入 ReactDOM.render ( ) 里
const element = <h1>Hello, world</h1>;
ReactDOM.render(element, document.getElementById('root'));
组件
由于元素没有办法传递参数,为了解决这个问题引入组件。
组件,从概念上类似于 JavaScript 函数。它接受任意的入参(即“props”),并返回用于描述页面展示内容的 React 元素(实现界面局部功能的代码和资源的集合)。
- 函数组件
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
ReactDOM.render(<Welcome/>,document.getElementById('root'));
执行了ReactDOM.render( )后,发生了什么?
- React解析组件标签,找到了 Welcome
- 发现组件是使用函数定义的,随后调用该函数,将返回的虚拟DOM转为真实DOM,随后呈现在页面上。
- class 组件
class Welcome extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
ReactDOM.render(<Welcome/>,document.getElementById('root'));
执行了ReactDOM.render( )后,发生了什么?
- React解析组件标签,找到了 Welcome
- 发现组件是使用类定义的,随后new出来该类的实例,并通过该实例调用到原型上的render方法
- 将render返回的虚拟DOM转为真实DOM,随后呈现在页面中
- 渲染组件
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
//创建对象,并指定属性
const element = <Welcome name="Sara" />;
ReactDOM.render(
element,
document.getElementById('root')
);
让我们来回顾一下这个例子中发生了什么:
- 我们调用 ReactDOM.render() 函数,并传入 < Welcome name=“Sara” /> 作为参数
- React 调用 Welcome 组件,并将 { name: ‘Sara’ } 作为 props 传入
- Welcome 组件将 < h1 >Hello, Sara< /h1 > 元素作为返回值
- React DOM 将 DOM 高效地更新为 < h1 >Hello, Sara< /h1 >
注意:组件的名称必须首字母大写。
React 会将以小写字母开头的组件视为原生 DOM 标签。例如,< div /> 代表 HTML 的 div 标签,而 < Welcome /> 则代表一个组件,并且需在作用域内使用 Welcome。
Props
在 react 中可以将任何东西(对象、函数等)作为props进行传递。
State
React 有一个严格的规则:所有的组件的props都不能被更改。为了在不违反这个规则的情况下,能够更改输出内容,引入了“state”概念。
state 不可直接更改,如需更改,调用setState
setState修改state的方式是浅合并,即需要修改的替换,不需要修改的保持不变
state值是对象(包含多个key-value组合)
初始化state的两种方法:
在React的组件中可以在两个位置来初始化state:
(1)在组件的constructor中;
(2)直接在class中利用属性赋值的方式
展开运算符(…)
回调函数就是传递一个参数化的函数
生命周期方法:为class组件声明的一些特殊的方法,当组件挂载或卸载时就会去执行这些方法
将事件处理函数通过箭头函数的形式来定义,就不必强制绑定this(见上图)
渲染和更新机制
React 渲染流程:
React 更新流程:
列表与key
react在渲染列表时必须指定一个唯一个key。
一个好的经验法则是:在 map() 方法中的元素需要设置 key 属性。