- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 React,我正在尝试了解生命周期。我正在做 componentWillMount
方法以获得props
我需要在渲染发生之前。我需要知道如何在加载 View 时更新状态。
我想做的就是 GET
请求以获得赌场游戏的经销商列表。基本上,我缺少用于在 DOM 中呈现经销商列表的 1 或 2 个步骤
我会展示我用我的代码做了什么,然后我会解释我想要什么
Action 部分
getDealerActions.js
class GetDealersActions {
constructor () {
this.generateActions('dealerDataSuccess', 'dealerDataFail');
}
getDealers (data) {
const that = this;
that.dispatch();
axios.get('someroute/get-dealers/get-dealers')
.then(function success (response) {
that.actions.dealerDataSuccess({...response.data});
})
}
};
然后我们去商店
getDealersStore.js
class GetDealersStore {
constructor () {
this.state = {
dealerData : null,
};
}
@bind(GetDealersActions.dealerDataSuccess)
dealerDataSuccess (data) {
this.setState({
dealerData : data,
});
console.log(this.state.dealerData);
}
}
在这种情况下 console.log(this.state.dealerData);
返回这样的东西,这正是我需要的
Object {dealersData: Array[3]}
问题出在组件部分,老实说,因为我不知道如何处理这里的数据
@connectToStores
export default class Dealers extends Component {
static contextTypes = {
router : React.PropTypes.func,
}
constructor (props) {
super(props);
this.state = {}
}
static getStores () {
return [ GetDealersStore ];
}
static getPropsFromStores () {
return GetDealersStore.getState();
}
componentWillMount () {
console.log('@@@', this.props);
GetDealersActions.getDealers();
}
render () {
console.log('>>>', this.props);
let content;
if (this.state.dealerData) {
content = this.state.dealerData.map((item) => {
return <div key={item.CardId}>{item}</div>;
});
} else {
content = <div>Loading . . .</div>;
}
return (
<div>
<div>{content}</div>
</div>
);
}
}
所有我到这里<div>{content}</div>
是Loading . . .
因为this.state
就这样来了Object {}
我遇到了一个奇怪的情况,这个 View 渲染了两次,第一次是渲染,console.log('>>>', this.props);
返回此 >>> Object {params: Object, query: Object}
第二次渲染时,触发这个 >>> Object {params: Object, query: Object, dealerData: Object}
这就是我需要的。
那么,为什么 componentWillMount
正在等待渲染方法以便被解雇?
最佳答案
一点都不奇怪。 componentWillMount
将在渲染之前触发,在第一遍中,您将调用一个操作来获取经销商 GetDealersActions.getDealers();
,这基本上是一个异步命令。由于它是异步的,组件在获取数据之前会渲染一次,然后在商店发布 changed
事件后再次渲染,这将重新触发渲染。
这是您的示例中发生的操作顺序的近似值:
componentWillMount
调用 getDealers
命令(异步)render
dealer
数据设置的changed
事件,重新触发渲染render
使用组件状态中的 dealer
数据调用。问题是 React 会按特定顺序运行它的生命周期方法,而不关心你调用了一些异步方法。所以基本上你没有办法仅仅因为你调用了一个命令来获取 dealers
就停止 rendering
。这是 react
(或功能)的局限性,当与异步编程结合使用时会出现这种局限性,您应该按原样接受它。
如果您接受 React 会渲染两次这一事实,您可以利用它,所以在第一次渲染时您可以只显示一个 loading
指示器(例如一个纺车)以及何时加载数据加载您只需在第二个 render
中显示它。
但是,如果您不相信并且仍然想避免在初始加载时出现双重渲染,您可以在安装应用程序组件之前预取数据,这将确保在加载之前将初始数据加载到存储中首先 render
,这意味着您不必在 componentWillMount
中调用 getDealers
,因为数据已经在第一个存储中渲染
。
提醒一下,双重渲染并不是一个严重的性能问题,就像在 Angular.js 或 Ember.js 中一样,因为 React 在 DOM 操作方面非常高效,但如果处理不当,它可能会产生一些 UX 问题.
关于javascript - 为什么渲染后调用componentWillMount?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33025435/
在我的代码中,我没有任何显式使用 componentWillMount,但在运行 webpack 时我仍然看到一些警告. react-dom.development.js:12386 Warning:
据我所知,componentWillMount 唯一可以做而 constructor 不能做的就是调用 setState。 componentWillMount() { setState({
我正在react组件的componentWillMount函数中发出ajax请求。我有一个状态变量。我将此变量的状态设置为 ajax 调用的响应。 this.setState({state_varia
在 ReactJs 中,我们可以使用 componentWillMount 做哪些不能通过构造函数做的事情?两者都在组件渲染之前调用一次。 import React from 'react'; cla
我在reactjs 中的状态方面面临一些困难。据我所知,componentWillMount 是在渲染组件之前使用 ajax 调用加载数据的地方。我有一个简单的项目,它用加载的数据填充面板堆栈并将其显
我正在创建一个内部布局。我是从另一个场景看到这个场景的。所以一开始就渲染了另一个布局。当我进入第二个场景(带有 TextInput 标签)后,我收到警告,例如: componentWillMount
触发服务器调用以在 componentWillMount 生命周期方法中获取数据是一个不好的做法吗? 以及为什么最好使用 componentDidMount。 最佳答案 更新: componentWi
首先,我是 React 新手,这是我的第一个项目。 我正在创建一个基本的博客应用程序,我的应用程序类如下所示: var App = React.createClass({ getInitial
我正在学习 React。我在 vanilla JS 中有一个小函数,它随机生成一个给定的图像。由于它是随机的,并且没有(有意)保存到任何状态,因此每个状态更改也会更改图像,这是我试图避免的。该图像将用
如果已经登录,我正在努力重定向到主页。我正在使用 ping 获取登录信息,如果成功,我将设置一个状态,该状态将在渲染和重定向中进行检查。但几秒钟后它会显示登录页面,然后重定向到主页。我做错了什么? e
对于react-native,我想使用componentWillMount而不使用类 await Font.loadAsync({ gotham_medium: require("../.
正如官方文档所说, componentWillMount 现已弃用,建议放置用于此生命周期方法的任何代码都放入构造函数中。 老实说我不知道该怎么做。我已经得到了用于 componentWillMo
我在安装组件之前调用 API,但我的代码调用 API 两次。我的要求是在成功调用 API 后显示年份数据(它将返回年份数据)。如果我在 componentWillMount 中使用 setState
我的 componentWillMount() 每次切换路由时都会被调用。 有没有其他方法可以处理商店状态的变化? 当我第一次使用这两个功能时没问题,但是当我切换路线并返回并尝试再次使用它们时,我收到
我正在使用 React.js,如您所知,componentWillMount() 将被弃用。我想替换我的 componentWillMount。 我要把它的逻辑移到constructor中。在 com
一个类用于拦截 axios 错误。为了绑定(bind)箭头函数,正在使用 componentDidMount()。现在我需要从服务器初始化数据,所以我必须使用 componentWillMount()
我有一个关于何时 componentDidMount 以及何时触发的问题,我是使用 React 的新手,并且文档的示例很模糊。为什么我的组件没有触发? var App = React.createCl
从昨天开始(我认为)我开始收到来自 React 的警告: Warning: componentWillMount has been renamed, and is not recommended fo
我收到四个无法在控制台中最小化的重大警告。这些警告来 self 的理解,不是因为我做错了什么,而是因为react-router-dom和react-select使用了已弃用的componentWill
如果我有一个需要一些设置的 React 组件(例如计时器或 WebAudio API 等),我很难决定初始化应该在 constructor 中进行还是在 componentWillMount 中进行。
我是一名优秀的程序员,十分优秀!