【发布时间】:2015-06-30 21:16:54
【问题描述】:
问题解决了。代码没问题,问题在于不正确的导入。
这是一篇很长的帖子(由于代码示例)。感谢您的耐心等待,并非常感谢您的帮助!
我们有一个 RoR 后端,前端有 React,我们使用 alt 作为 Flux 的实现。我们也使用 babel 将 ES6 编译为 ES5。所以问题是由于 2 个错误,我无法渲染组件。
第一个是Uncaught TypeError: Cannot read property 'map' of undefined
出现在 MapPalette 组件的渲染函数中:
render() {
return (
<div>
{this.state.featureCategories.map(fc => <PaletteItemsList featureCategory={fc} />)}
</div>
);
}
第二个是Uncaught Error: Invariant Violation: receiveComponent(...): Can only update a mounted component.
这是整个 MapPalette 组件
"use strict";
import React from 'react';
import PaletteItemsList from './PaletteItemsList';
import FeatureCategoryStore from '../stores/FeatureTypeStore';
function getAppState() {
return {
featureCategories: FeatureCategoryStore.getState().featureCategories
};
}
var MapPalette = React.createClass({
displayName: 'MapPalette',
propTypes: {
featureSetId: React.PropTypes.number.isRequired
},
getInitialState() {
return getAppState();
},
componentDidMount() {
FeatureCategoryStore.listen(this._onChange);
},
componentWillUnmount() {
FeatureCategoryStore.unlisten(this._onChange);
},
render() {
return (
<div>
{this.state.featureCategories.map(fc => <PaletteItemsList featureCategory={fc} />)}
</div>
);
},
_onChange() {
this.setState(getAppState());
}
});
module.exports = MapPalette;
FeatureCategoryStore
var featureCategoryStore = alt.createStore(class FeatureCategoryStore {
constructor() {
this.bindActions(FeatureCategoryActions)
this.featureCategories = [];
}
onReceiveAll(featureCategories) {
this.featureCategories = featureCategories;
}
})
module.exports = featureCategoryStore
FeatureCategoryActions
class FeatureCategoryActions {
receiveAll(featureCategories) {
this.dispatch(featureCategories)
}
getFeatureSetCategories(featureSetId) {
var url = '/feature_categories/nested_feature_types.json';
var actions = this.actions;
this.dispatch();
request.get(url)
.query({ feature_set_id: featureSetId })
.end( function(response) {
actions.receiveAll(response.body);
});
}
}
module.exports = alt.createActions(FeatureCategoryActions);
最后 - 我如何渲染 React 组件。
var render = function() {
FeatureCategoryActions.getFeatureSetCategories(#{ @feature_set.id });
React.render(
React.createElement(FeatureSetEditMap, {featureSetId: #{@feature_set.id}}),
document.getElementById('react-app')
)
}
【问题讨论】:
-
首先,在return块外准备循环,即创建一个新变量,然后将
this.state.featureCategories.map(fc => <PaletteItemsList featureCategory={fc} />的内容保存在render函数中而不是return块中。然后在返回部分的 中使用该变量 -
@KoustuvSinha 你为什么要那样做?我认为它现在的阅读方式要好得多。
-
它读起来更好,是的,但是如果你在返回全部之前构造数组会更容易调试
-
这是一个很好的观点,即使我不会为了便于调试而构建我的代码。您可能需要编辑评论以反映这一点,因为目前您的评论看起来好像与 OP 问题有关。
标签: reactjs reactjs-flux flux react-alt