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界面性能的十个技巧)
- 使用react生命周期的常见情况(react+ts实现简单jira项目的最佳实践记录)
- react组件之间通信(React传递参数的几种方式)
- html5创作(HTML5录音实践总结Preact)
- react组件封装成函数方法(React虚拟列表的实现)
- react定时任务(手把手带你用React撸一个日程组件)
- react 分页列表优化(使用react-beautiful-dnd实现列表间拖拽踩坑)
- react配置上下文路由(React中Portals与错误边界处理实现)
- react的基本知识(React中refs的一些常见用法汇总)
- reactnative零基础入门到项目实战(用React Native制作一个简单的游戏引擎)
- react和antd项目教程(React引入antd-mobile+postcss搭建移动端)
- react怎么绑定state(react纯函数组件setState更新页面不刷新的解决)
- linux虚拟内存实现需要哪六种机制(解析Linux高性能网络IO和Reactor模型)
- react判断数据格式(详解Ref在React中的交叉用法)
- react usestate实现原理(浅谈react useEffect闭包的坑)
- react自适应布局如何实现(React实现分页效果)
- 吉林舒兰 封城 15人确诊 276人隔离,出现跨省传播(吉林舒兰封城)
- 四月新番CP人气榜公布,《剃须》两度上榜,沙优不是女朋友(四月新番CP人气榜公布)
- 2019年外媒秋季新番动画角色CP排行榜,桐人和爱丽丝落榜(2019年外媒秋季新番动画角色CP排行榜)
- 新一小兰领衔 盘点动漫中的那些 远距离恋爱情侣(盘点动漫中的那些)
- 大事件 合肥四中火了(大事件合肥四中火了)
- 翼龙贷组织出借人调研 感受鄱阳 借 来的致富路(翼龙贷组织出借人调研)
热门推荐
- django用户权限管理(Django 内置权限扩展案例详解)
- sqlserver2000升级教程(MSSQL 2000 使用帮助sql server简明教程)
- javascript将字符串转换成数组(如何将JavaScript将数组转为树形结构)
- docker管理工具选择(Docker可视化管理工具DockerUI的使用)
- Asp.net Mvc模型绑定
- docker-compose部署实例(详解docker-compose速度太慢解决方式)
- 织梦联动菜单的下拉代码(dede5.7 动态导航下拉菜单的实现代码)
- css3动画实现loading(CSS3实现粒子旋转伸缩加载动画)
- python字典的值排序(python 对字典按照value进行排序的方法)
- dedecms后台账号(dedecms批量删除会员的SQL命令)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9