Part2-传值、路由与请求
预习视频
视频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、销毁/清除期:组件使用完毕后,或者不需要存在与页面中,那么将组件移除,执行销毁。
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
现实生活中的路由:用来管理网络和计算机之间的关系
程序中的路由:用来管理url地址和视图之间的关系
路由原理:
1、准备视图(html)
2、准备路由的路线(可以是一个对象,键名是路线名称和值是视图地址)
3、通过hash地址的路线,获取“视图地址”
4、在指定标签中,加载需要的视图页面
代码演示:
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.js 与 Error.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,然后:
从Home使用state携带参数跳到List,并打印this.props.history.location.state
从List使用url携带参数跳到Detail
在Detail执行this.props.history.goBack()
即可看到state丢失
十、数据请求【重要】
安装axios:
在组件中引入:
十一、作业
作业1(初级)
请完成以下demo的跳转与布局(手写css)。
项目地址:http://codesohigh.com/manage/
作业2(中级)
使用react+bootstrap进行布局。
作业3(高级)
最后更新于
这有帮助吗?


