react并不是一个MVC框架,他只是一个很强大的javaScript库,主要作用是用来构建UI界面。
react的核心是封装一个个大大小小的组件(小到一个按钮,大到一个页面)来构建复杂的UI界面,每个组件都是UI的一部分。
react的组件就是返回标签的javaScript函数。例如:
function MyButton() {? ?
????????return ( <button>I'm a button</button> );? ?
}
从以上概念可知,react组件就是一部分的js逻辑,封装的独立的可复用的代码片段,这样每个片段都可以进行独立的管理,很好的实现了代码的复用。
注意:组件的首字母必须要大写
函数(function)组件:
函数式组件其实就是官网的标准案例,定义一个函数,接受任意的props参数,函数中返回jsx语法的页面UI内容。
示例:
export default function MyApp() {
return (
<div>
<h1>Welcome to my app</h1>
<MyButton />
</div>
);
}
类(class)组件:
通过声明ES6中的类(class)来定义一个React组件。其中,必须要继承React.Component类或React.PureComponent类;类中必须要定义一个名为render的函数,该函数的返回值是JSX语法编写的React元素。
class组件不同于函数组件的是,class组件会创建对应的实例,因此只有class组件才有生命周期
注意:
- 类的内部默认会有个props属性(继承自Component),可以直接使用
- 在类的构造函数(constructor)中通过this.props访问属性值是获取不到的,因为这时props还没有挂载到this.props上,等到constructor执行完成之后才会挂载(除非把外面传进来的props传递给constructor中的父类构造函数super从而实现this.props的挂载)
- 类组件是动态组件,基于数据驱动视图渲染
示例:
// 创建一个类式组件
import React from 'react' ?
class Mycomponent extends React.Component { ? ?
constructor(props){ ? ? ? ?
super(props) ?
}
render(){ ? ? ? ?
return( ? ? ?
<div>hello Mycomponent!</div> ? ? ?
) ?
}
}
export default Mycomponent
// 渲染到页面中的指定DOM
// ReactDOM.render(虚拟DOM,真实DOM)
ReactDOM.render(<MyComponent />, document.getElementById('test'))
let c = new MyComponent()
如果想传递数据给子组件,可通过props方式:
(1)在引用组件的标签处通过 props属性名={属性值}?的方式来设置传入的props
(2)在子组件入参处通过解构的方式获取props
示例:
function MyApp() {
// 传递给MyLabel组件两个props,info和height
return (
<MyLabel
info={{ name: '张三', id: '123' }}
height={100}
/>
);
}
// MyLabel组件,可以获取传入的props
function MyLabel({info, height}) {
// ... ...
}
概念:JSX(JavaScript XML)首先被应用在react中,他是一种javaScript语法的扩展,比较类似于模板语言。他最终产生的是js对象,既不是字符串(不要加引号)也不是html/xml标签。
作用:用来简化创建虚拟DOM,使代码更简洁,更容易维护。
需要注意的规则:
参考:JSX基本语法规则
useState使用:
(1)引入useState:import { useState } from 'react';
(2)自定义state变量和set方法:const [sth,?setSth] = useState(initialValue)
(3)使用:通过sth直接取值,通过setSth(value)更新值
HOOK理解:
以useXXX开头的函数被称为HOOK,React内置了很多的HOOK供用户使用,useState就是其中一种。其他的还有useContext(读取和订阅组件中的context)、useRef(帮助引用一个不需要渲染的值)等。具体可查看官方API
同时React支持自定义HOOK。
HOOK的调用说明:
HOOK的要求比较严格,必须在组件顶层调用,如果想在一个循环或者条件逻辑中调用,只能再抽一个子组件放在顶层调用。