javascript – React JS中调用特定props更改的组件方法的正确模式是什么?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – React JS中调用特定props更改的组件方法的正确模式是什么?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2012字,纯文字阅读大概需要3分钟。
内容图文
使用React和Redux,假设您有一个将请求发送到外部API的组件方法.
import React, { Component } from 'react';
import { connect } from 'react-redux';
class MyComp extends Component {
boolUpdate (val) {
fetch('http://myapi.com/bool', { val });
}
shouldComponentUpdate (nextProps) {
return false;
}
render () {
return <h1>Hello</h1>;
}
}
const mapStateToProps = ({ bool }) => ({ bool });
export default connect(mapStateToProps)(MyComp);
现在让我们假设您希望每次bool prop更改时调用boolUpdate(),但这不应该触发组件更新,因为组件的呈现中没有任何内容受到影响.
在React中执行此操作的最佳方法是什么?
直到最近,人们常常做类似的事情:
componentWillReceiveProps (nextProps) {
if (nextProps.bool !== this.props.bool) this.boolUpdate(nextProps.bool);
}
但是从React v16.3开始,componentWillReceiveProps()已被弃用.在这个例子中,我们也不能使用componentDidUpdate(),因为shouldComponentUpdate()可以防止这种情况发生. getDerivedStateFromProps()是一个静态方法,因此它无权访问实例方法.
因此,我们留下的唯一选择似乎是使用shouldComponentUpdate()本身.有点像:
shouldComponentUpdate (nextProps) {
if (nextProps.bool !== this.props.bool) this.boolUpdate(nextProps.bool);
return false;
}
这对我来说看起来相当“hacky”,而不是shouldComponentUpdate()的设计目的.
有没有人有更好的模式建议?
是否有一种倾听特定道具变化和触发组件方法的首选方法?
谢谢!
解决方法:
如果你想在道具改变时运行一些代码(例如数据提取),请在componentDidUpdate中执行.
componentDidUpdate(prevProps) {
if (prevProps.id !== this.props.id) {
this.fetchData();
}
}
在您的示例中,这将不起作用,因为shouldComponentUpdate返回false.我认为这不是一个非常常见的情况,因为通常你仍然想要在道具改变的情况下重新渲染.
例如,如果用户ID更改,您可能希望在加载新用户的数据时显示加载指示符.因此,在这种情况下,避免重新渲染并不是很有用.
但是,如果您完全确定两者都需要阻止重新渲染并且需要执行副作用,例如在道具更改中获取数据,则可以将组件拆分为两个.外部组件将在componentDidUpdate中执行数据提取,并返回< InnerComponent {... this.props} />.内部组件将具有shouldComponentUpdate实现,该实现可防止进一步重新呈现.同样,我不希望这是一个常见的情况,但你可以做到这一点.
内容总结
以上是互联网集市为您收集整理的javascript – React JS中调用特定props更改的组件方法的正确模式是什么?全部内容,希望文章能够帮你解决javascript – React JS中调用特定props更改的组件方法的正确模式是什么?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。