react的setstate第二个参数(示例详解react中useState的用法)
react的setstate第二个参数
示例详解react中useState的用法useStateuseState 通过在函数组件里调用它来给组件添加一些内部 state。React 会在重复渲染时保留这个 state。useState
会返回一对值:当前状态和一个让你更新它的函数,你可以在事件处理函数中或其他一些地方调用这个函数。它类似 class 组件的
this.setState,但是它不会把新的 state 和旧的 state 进行合并。
接下来通过一个示例来看看怎么使用 useState。
有这么一个需求:需要在 iframe 中加载外部网页。
初始的代码我们通过 函数式组件 来实现这个需求,只需要简单的渲染一个 iframe:
import React, { useState } from 'react'; import styles from './index.less'; function Link(props) { const { match: { params: { link = '' } = {} } = {} } = props; const enCodeUrl = decodeURIComponent(link); const url = enCodeUrl.startsWith('http') ? enCodeUrl : `http://${enCodeUrl}`; return ( <React.Fragment> <iframe title={link} src={url} style={{ width: '100%', height: '100%', verticalAlign: 'top' }} frameBorder="0" /> </React.Fragment> ); } export default Link;
新的需求来了,我们需要给页面添加一个 loading 效果,实现的方式很简单,监听 iframe 的 load 事件 来设置loading的开始和结束。
为了实现这个需求,我们需要存放loading的状态,而函数式组件是没有自有状态的,我们得改造成 class 组件:
import React from 'react'; import { Spin } from 'antd'; import styles from './index.less'; export default class Link extends React.Component { state = { // 存放loading状态 iLoading: true, }; linkLoad() { // 更新loading this.setState({ iLoading: false }); } render() { const { match: { params: { link = '' } = {} } = {} } = this.props; const { iLoading } = this.state; const enCodeUrl = decodeURIComponent(link); const url = enCodeUrl.startsWith('http') ? enCodeUrl : `http://${enCodeUrl}`; return ( <React.Fragment> <Spin spinning={iLoading} wrapperClassName={styles['iframe-loading']}> <iframe onLoad={this.linkLoad.bind(this)} title={link} src={url} style={{ width: '100%', height: '100%', verticalAlign: 'top' }} frameBorder="0" /> </Spin> </React.Fragment> ); } }
为了实现一个页面的loading,我们需要去使用class,同时还需要bind绑定this等繁琐行为,这只是一个简单的需求,而我们却可以通过hooks来解决这些问题,同时还能解决组件间状态复用的问题,我们使用useState来实现。
导入 useState import React, { useState } from 'react'; 定义状态 // useState 的参数为状态初始值,setInitLoading为变更状态值的方法 const [initLoading, setInitLoading] = useState(true); 更新状态 onLoad={() => setInitLoading(false)} 完整代码如下: import React, { useState } from 'react'; import { Spin } from 'hzero-ui'; import styles from './index.less'; function Link(props) { const { match: { params: { link = '' } = {} } = {} } = props; const [initLoading, setInitLoading] = useState(true); const enCodeUrl = decodeURIComponent(link); const url = enCodeUrl.startsWith('http') ? enCodeUrl : `http://${enCodeUrl}`; return ( <React.Fragment> <Spin spinning={initLoading} wrapperClassName={styles['iframe-loading']}> <iframe onLoad={() => setInitLoading(false)} title={link} src={url} style={{ width: '100%', height: '100%', verticalAlign: 'top' }} frameBorder="0" /> </Spin> </React.Fragment> ); } export default Link;
下面看看useState注意事项
useState 的参数useState 的参数可以是基本类型,也可以是对象类型,在更新对象类型时,切记要合并旧的状态,否则旧的状态会丢失
const [params, setParams] = useState({ rotate: 0, color: "#000000" }); const handleInputChange = event => { const target = event.target; setParams({ ...params, [target.name]: target.value }); };
如果当前的状态需要根据最后一次更新的状态的值计算出来,则给更新状态的函数传递一个函数,此函数的第一个参数即为最后一次更新的值,然后把计算后的结果做为返回值返回出去。
总结利用 useState hook 可以让函数式组件拥有状态管理特性,它与传统的 class 组件的状态管理类似,但是更加简洁,不用频繁的使用 this。在后面的文章中将会介绍到如何结合其他的 hooks 对业务逻辑进行抽离以使组件代码和 hooks 代码各司其职。
- react常用组件及作用(React中的Context应用场景分析)
- react代码展示(教你如何从 html 实现一个 react)
- reacthooks用法(详解React Hooks是如何工作的)
- react hooks详解(React Hooks使用常见的坑)
- react基础知识入门(浅谈React 的引入)
- html5创作(HTML5录音实践总结Preact)
- yii2对比springboot(yii2.0框架使用 beforeAction 防非法登陆的方法分析)
- react基础知识详解(如何深入理解React的ref 属性)
- react的动画实现(React实现动效弹窗组件)
- react绑定详解(React列表栏及购物车组件使用详解)
- react 封装下拉选择框(React鼠标多选功能的配置方法)
- react高阶组件怎么用(React 高阶组件HOC用法归纳)
- react源码教程(详解React 代码共享最佳实践方式)
- react怎样实现响应式计算属性(深入浅析React中diff算法)
- react配置上下文路由(React中Portals与错误边界处理实现)
- react循环有几种方法(React forwardRef的使用方法及注意点)
- 爱情是什么(爱情是什么最经典的话)
- 乔欣 古装剧中的高颜值(古装剧中的高颜值)
- 怎么才可以财富自由(如何让自己实现财富自由)
- 为什么越来越多年轻人回农村(为什么越来越多年轻人回农村生活)
- 怎么快速学好英语(怎么快速学好英语初中)
- 中国留学生都是富二代吗()
热门推荐
- navicat注册和激活码(Navicat12.1系列破解激活教程亲测有效)
- pyqt5界面绘图(PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形)
- 游标和sql语句区别(详解SQL游标的用法)
- html5实现上传图片预览
- php中如何打开文件读文件(PHP通过文件保存和更新信息的方法分析)
- 简简单单教你用python写个游戏(python3 pygame实现接小球游戏)
- mysql索引的类型和方法(MySQL覆盖索引的使用示例)
- visual studio中快速定位打开的文件所处的树形路径
- 什么是高内聚、低耦合
- mysql程序中判断select返回空值(解决MySQL读写分离导致insert后select不到数据的问题)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9