开始学习react的第一天
React
意义:是用于构建用户界面的JavaScript库,最新的版本为18.x版本 (通常进行维护的是16.x和17.x版本)
首先使用create-react-app 'name'进行脚手架的创建
简称:CRA
该脚手架是Facebook开发的官方脚手架,最新为5.x版本,运行环境需要NodeJS版本在16.x以上(可以使用nvm对NodeJS版本进行管理)
npm create-react-app <name>
主要的依赖包:
- react:核心包
- react-dom:主要用于对DOM进行渲染
- react-scripts:主要封装了webpack的配置,提供了可执行的脚本任务
可执行的
- start - 启动开发任务
- build - 构建,启动生产任务,打包构建生产环境代码
- test - 测试
- eject - 弹出,弹出webpack的配置到项目本地(项目目录下,即将webpack的配置还原到项目目录中)。注意,这种弹出操作是不可撤销的
JSX
JSX,既不是字符串也不是HTML,是一个JavaScript的语法扩展。
注意,在16.x版本中要使用JSX的语法必须引入react包
内嵌js表达式
使用{ expression } 语法:
const message = 'React'
const element = <h1 title={ message }>Hello { message }</h1>
属性中嵌入JavaScript表达式时,不要在大括号外面加上引号。
防止注入攻击
JSX中使用{}来渲染html文本时,会进行转义处理,以防止XXS攻击。
如果需要渲染html文本可以使用:
<div dangerouslySetInnerHTML> { _html:message } </div>
使用dangerouslySetInnerHTMl属性,其值必须是一个对象,且需要拥有_html属性。
注意:绝不要对用户输入的内容进行html渲染
语法糖
JSX实际上是一个语法糖,可使用Babel转译工具,将JSX表达式的内容转译为React.createElement()的调用。
const element = (
<h1 className="greeting">
Hello, world!
</h1>
);
转译为:
const element = React.createElement(
'h1',
{className: 'greeting'},
'Hello, world!'
);
Fargment
用<React.Fargment>渲染的节点在DOM树中不会渲染真实的DOM
节点,可用于逻辑中进行分组处理。
可以简写为<></>标记,但使用简写形式时,不能添加属性的设置。
组件
函数组件
本质上是一个函数,传递组件渲染时接收到的属性作为参数,返回组件渲染的结构表示的React元素,如:
const Elment = (props) =>{
return ( <h1 title={ props.title }> { props.message } </h1> )
props是组件渲染接收到的属性对象- 组件名称首字母大写
类组件
利用ES6中class语法来实现,如:
imoprt { component } from 'react'
class Element extends Component{
// 定义组件自身私有使用到的状态数据
// 这是 constructor 中的简写写法
state = {
title:'标题'
}
//方法1 改变this的指向
handleChange1(){
this.state.title = "副标题"
}
//方法2 使用箭头函数
handleChange2 = () =>{
this.state.title = "副标题"
}
render(){
return (
<button onClick={ this.handleChnage1.bind(this)} >方法1修改</button>
<button onClick={ this.handleChnage2 }>方法2修改</button>
<h1> { this.state.title } </h1>
)
}
}
- 继承自
React.Component父类 - 必须实现
render()函数 - 从父类中继续
props的使用(在render中可以使用this.props调用到的组件渲染时传递的属性) - 调用函数方法有两种方法:改变this指向和使用箭头函数,调用事件使用小驼峰命名法
State
state是组件自身私有使用到的状态数据。这是class组件中才有的,在函数组件中没有state这个属性。
在组件中要修改state状态数据值,需要调用setState()方法来修改,才会有响应式渲染效果。
正确的使用方法:
- 不能直接修改
state的值(需要调用setState()方法来修改) state的更新可能是异步的state的更新可能会被合并
Props
属性,用于接收从父组件中传递的数据
在函数组件中,从函数第一个参数中获取到的属性props对象;
在class组件中,使用this.props获取到props属性对象;
props只读性
在组件中,props应该是只读的,不要尝试修改属性的值
组件渲染
利用函数组件的函数名或组件的类名作为标签名称,渲染使用,如:
<Element title="" message="" />
组件渲染时,需要使用首字母大写的标签实现渲染。在JSX中使用小写字母开头的被识别为html标签,如果html标签中没有相关的标签字符串,则报错
类型检查
运行时类型检查:props-types
安装prop-types包:
npm i prop-types
class 组件中:
import PropTypes from 'props-types'
class MyHeader extends Component {
// 这是一个静态属性,与类主体外直接使用 MyHeader.propTypes = {} 是一样的意思
static propTypes = {
title: PropTypes.string,
subtitle: PropTypes.string,
}
static defaultProps = {
title: '默认主标题',
subtitle: '默认副标题',
}
render() {
return (
<div>
<h1>{ this.props.title }</h1>
<h2>{ this.props.subtitle }</h2>
</div>
)
}
}
函数组件中:
import PropTypes from 'prop-types'
/**
* 函数组件
*/
function MyHeader(props) {
return (
<div>
<h1>{ props.title }</h1>
<h2>{ props.subtitle }</h2>
</div>
)
}
// 在函数下挂载一个 propTypes 属性,用于进行运行时 props 类型检查
MyHeader.propTypes = {
title: PropTypes.string,
subtitle: PropTypes.string,
}
// 在函数下挂载一个 defaultProps 属性,用于设置属性默认值
MyHeader.defaultProps = {
title: '默认主标题',
subtitle: '默认副标题',
}
静态的类型检查:typescript
事件处理
与html标签中事件处理属性类似,但React的JSX语法中使用驼峰命名规范,引用事件处理函数名称。
注意:在事件处理函数中class组件中如果有使用到this,通常需要修改this指向(可使用.bind()方法手动绑定this指向,也可以在定义clas类成员方法时,使用箭头函数的写法)
条件渲染
使用if-else或使用三目运算符等实现,如:
render() {
return (
<>
<div><button onClick={this.handleClick}>显示/隐藏</button></div>
{
this.state.visible
? <div>需要显示或隐藏的内容</div>
: null
}
</>
)
}
列表渲染
通常调用数组的.map()方法实现列表渲染:
render() {
return (
<>
<div>所有可选课程信息:</div>
<ol>
{
// 列表渲染
this.state.courses.map(course => {
return (
<li key={course.id}>{ course.name }</li>
)
})
// [<li>HTML</li>, <li>CSS</li>]
}
</ol>
</>
)
}
表单处理
可结合在Vue中的V-model的原理来理解react中表单处理逻辑。
可以在文本框与select选择框中绑定value属性,处理onChange事件来完成表单字段的处理
在checkbox与radio中绑定checked属性和处理onChange事件来完成表字段处理
总结
这是react的基础核心的学习