React中useState的使用方法是怎样,有哪些要注意
Admin 2022-06-07 群英技术资讯 1045 次浏览
这篇文章主要讲解了“React中useState的使用方法是怎样,有哪些要注意”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“React中useState的使用方法是怎样,有哪些要注意”吧!useState 通过在函数组件里调用它来给组件添加一些内部 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 的参数可以是基本类型,也可以是对象类型,在更新对象类型时,切记要合并旧的状态,否则旧的状态会丢失
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 代码各司其职。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
Object.freeze(obj)可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已经属性,不能修改该对象已有属性的可枚举性、可配置性、可写性、以及不能修改已有属性的值。
React服务端渲染原理是什么?很多朋友可能听说过React服务端渲染,但是对其原理并不清楚,因此下面小编就给大家介绍一下React服务端渲染原理以及实例,感兴趣的朋友可以参考。
这篇文章主要介绍了ElementUI下拉框选择后不显示值问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
本文主要介绍了React组件通信之路由传参(react-router-dom),文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
简介Diffie-Hellman(简称DH)是密钥交换算法之一,它的作用是保证通信双方在非安全的信道中安全地交换密钥。目前DH最重要的应用场景之一,就是在HTTPS的握手阶段,客户端、服务端利用DH算法交换对称密钥。下面会先简单介绍DH的数理基础,然后举例说明如何在nodejs中使用DH相关的API。数论基础要理解DH算法,需要掌握一定的数论基础。感兴趣的可以进一步研究推导过程,或者直接记
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008