Part2-传值、路由与请求

预习视频

【最新】零基础快速入门React 17.x

视频P21-P37

今日学习目标

  • 组件传值

  • 生命周期

  • 受控组件与不受控组件

  • 路由搭建

一、组件状态this.state的基本使用【重要】

组件状态this.state的基本使用总结:

// 定义状态数据:
constructor(props){
  super(props)

  this.state = {
    num: 20
  }
}

// 使用状态数据:
return (
  <div>
    <p>{this.state.num}</p>
  </div>
)


// 修改状态数据:
1、通过事件或者定时器触发:
  <button onClick={this.handleClick.bind(this)}>点击增加1</button>

2、在事件函数中:
this.setState({
  num: this.state.num+1
})

二、组件属性this.props【重要】

App5.js中:

三、子组件中限制传进来的props属性的数据类型 【了解】

子组件中可以限制传进来的props属性值的数据类型

实现步骤:

1、先导入import PropTypes from 'prop-types' (注意:无需安装,直接引入即可)

2、在子组件中定义静态属性propTypes:

实际运用:

四、子传父【重要】

子级通过 this.props.子级事件名(参数) 将事件传递给父级,父级在子组件标签上写:

通过这种方式来接收子级的事件。

例如:

五、使用context进行props属性值的多级传递 【了解】

React 组件之间的通信是基于 props 的数据传递,数据需要一级一级从上到下传递。如果组件级别过多传递就会过于麻烦。React中Context配置可以解决组件跨级值传递。

这里敲黑板:

childContextTypes 和 contextTypes 是不能省略的,跨级传值必须指定数据类型

六、React生命周期【重要】

生命周期:就是指一个对象的生老病死。 React的生命周期指从组件被创建到销毁的过程。掌握了组件的生命周期,就可以在适当的时候去做一些事情。

React生命周期可以分成三个阶段:

1、实例化(挂载阶段):对象创建到完全渲染

2、存在期(更新期):组件状态的改变

3、销毁/清除期:组件使用完毕后,或者不需要存在与页面中,那么将组件移除,执行销毁。

00

1、实例化/挂载阶段

constructor()

componentWillMount()

render()

componentDidMount()

2、存在期/更新期

存在期:且件已经渲染好并且用户可以与它进行交互。通常是通过一次鼠标点击、手指点按者键盘事件来触发一个事件处理器。随着用户改变了组件或者整个应用的state,便会有新的state流入组件树,并且我们将会获得操控它的机会。

componentWillReceiveProps()

shouldComponentUpdate()

componentWillUpdate()

render()

componentDidUpdate()

在上面的组建中继续书写生命周期函数:

以上执行的是组件内部state数据更新前后的生命周期函数,

其实,对于组件的props属性值发生改变的时候,同样需要更新视图,执行render

componentWillReceiveProps() 这个方法是将要接收新的props值的时候执行,而props属性值从父组件而来,所以需要定义父组件:

3、销毁期

componentWillUnmount() 销毁组件前做一些回收的操作

index.js中3秒后重新渲染页面:

4、生命周期小结

React组件的生命周期 3大阶段10个方法 1、初始化期(执行1次) 2、存在期 (执行N次) 3、销毁期 (执行1次)

小结: componentDidMount : 发送ajax异步请求

​ shouldComponentUpdate : 判断props或者state是否改变,目的:优化更新性能

七、不受控组件和受控组件【重要】

1、不受控组件

​ 组件中表单元素没有写value值,与state数据无关,不受组件管理。(不推荐)

2、受控组件

​ 组件中表单元素的value值受组件的state数据控制,并且该表单元素有onChange事件,我们可以在事件中对该表单做实时验证,验证值是否合法然后做相应的操作(推荐)

3、小结

React中的表单组件,分为2类: 1. 不受控组件(和状态无关) 1.1 在input标签组件中,使用ref属性,来代表组件标识 1.2 组件渲染后,会自动把有ref属性的dom对象,挂到this.refs上 this.refs = { ref名1 : dom对象 ref名2 : dom对象 } 1.3 在需要的场景(一般指回调),使用this.refs来获取需要的对象,然后再做dom操作

​ 2、 受控组件(和状态紧密相关) ​ 2.1 初始化状态 ​ 2.2 在input标签的value属性上,绑定状态(输入框的默认值和状态有关) ​ 2.3 在input标签上维护onChange属性,触发时即时修改状态 ​ 2.4 自动:当状态修改,立即触发声明周期的render方法,显示最先的状态值

使用: 如果对值的控制度不高,直接不受控组件 如果要严格把控值的操作,受控可以做表单验证等严格的逻辑(推荐)

八、路由原理【了解】

SPA: Single Page Application

例如:https://music.163.com/#/

现实生活中的路由:用来管理网络和计算机之间的关系

程序中的路由:用来管理url地址视图之间的关系

路由原理:

​ 1、准备视图(html)

​ 2、准备路由的路线(可以是一个对象,键名是路线名称和值是视图地址)

​ 3、通过hash地址的路线,获取“视图地址”

​ 4、在指定标签中,加载需要的视图页面

代码演示:

01

router.html

记得在head中添加jq

九、路由【重要】

react-router是跨平台的,内置通用组件和通用Hooks。react-router-dom是在react-router基础上提供了Link和NavLink,而且依赖history库提供了两个浏览器端适用的BrowserRouter和HashRouter。

Router4.x以前的版本,一般都有react-router。

Router4.x以后的版本,一般都指react-router-dom,一些常用的组件都封装好了。现在的项目基本都是使用react-router-dom。

1、安装

2、创建页面

然后我们新建两个页面,分别命名为“home”和“detail”。在页面中编写如下代码:

3、创建router组件

然后再新建一个路由组件,命名为 router.js,并编写如下代码:

字段解释:

以上代码中,标签上有个exact属性,这个属性是用来正确匹配子路由的。route的匹配规则有点类似于正则的贪婪匹配,为了避免这种情况,我们需要使用准确的匹配规则,这个时候就需要使用到route的两个属性(exact与strict)。

总结:

如果没有子路由的情况,建议大家配都加一个exact;如果有子路由,建议在子路由中加exact,父路由不加; 而strict是针对是否有反斜杠的,一般可以忽略不配置。

4、根路径与404页面

项目需要根路径与404页面,因此我们可以创建两个文件:MyIndex.jsError.js,分别写入:

然后在 router.js 中引入并进行重定向:

如果你还希望 Home.js 进入时直接重定向到 /home/sub1,可以在 Home.js 中使用:

5、路由引入

然后在 index.js 中引入:

此时,到浏览器输入 http://localhost:3000/#/http://localhost:3000/#/detail 就可以看到对应的页面。

备注:

其实我们也可以创建一个 routerConfig.js 的文件,专门用来做路由配置:

然后引入到 router.js 中,如:

6、通过事件跳转页面

给按钮加上onClick事件,通过this.props.history.push这个函数跳转到detail页面。在路由组件中加入的代码就是将history这个对象注册到组件的props中去,然后就可以在子组件中通过props调用history的push方法跳转页面。

Home.js 中:

如果想返回上一页,可以在 Detail.js 中:

7、传参

很多场景下,我们还需要在页面跳转的同时传递参数,在react-router-dom中,同样提供了两种方式进行传参。

* url传参

* 隐式传参

8、【验证】HashRouter模式下,goBack()方法会造成state丢失

为了验证这个bug,我们首先将 BrowserRouter 切换为 HashRouter,然后:

  1. 从Home使用state携带参数跳到List,并打印this.props.history.location.state

  2. 从List使用url携带参数跳到Detail

  3. 在Detail执行this.props.history.goBack()

即可看到state丢失

十、数据请求【重要】

安装axios:

在组件中引入:

十一、作业

作业1(初级)

请完成以下demo的跳转与布局(手写css)。

项目地址:http://codesohigh.com/manage/

image-20210523185711556

作业2(中级)

使用react+bootstrap进行布局。

作业3(高级)

预习Redux与ReactRedux

最后更新于

这有帮助吗?