React状态更新问题(抱歉,无法更具体地进行标题)

17 浏览
0 Comments

React状态更新问题(抱歉,无法更具体地进行标题)

我正在使用reactjs,但在尝试显示JSON数据(无论是来自文件还是服务器)时,似乎无法防止出现以下错误:

Uncaught TypeError: this.props.data.map is not a function

我已经查看了:

React code throwing “TypeError: this.props.data.map is not a function”

React.js this.props.data.map() is not a function

但这两个都没有帮助我解决问题。在页面加载后,我可以验证this.data.props不是未定义的(并且具有等同于JSON对象的值 - 可以使用window.foo调用),所以似乎在被ConversationList调用时它没有及时加载。如何确保map方法在JSON数据上工作而不是在undefined变量上?

var converter = new Showdown.converter();
var Conversation = React.createClass({
  render: function() {
    var rawMarkup = converter.makeHtml(this.props.children.toString());
    return (
          

{this.props.id} {this.props.last_message_snippet} {this.props.other_user_id}

); } }); var ConversationList = React.createClass({ render: function() { window.foo = this.props.data; var conversationNodes = this.props.data.map(function(conversation, index) { return ( last_message_snippet={conversation.last_message_snippet} other_user_id={conversation.other_user_id} ); }); return ( {conversationNodes} ); } }); var ConversationBox = React.createClass({ loadConversationsFromServer: function() { return $.ajax({ url: this.props.url, dataType: 'json', success: function(data) { this.setState({data: data}); }.bind(this), error: function(xhr, status, err) { console.error(this.props.url, status, err.toString()); }.bind(this) }); }, getInitialState: function() { return {data: []}; }, componentDidMount: function() { this.loadConversationsFromServer(); setInterval(this.loadConversationsFromServer, this.props.pollInterval); }, render: function() { return (

Conversations

); } }); $(document).on("page:change", function() { var $content = $("#content"); if ($content.length > 0) { React.render( , document.getElementById('content') ); } })

编辑:添加样本conversations.json

注意 - 调用this.props.data.conversations也会返回错误:

var conversationNodes = this.props.data.conversations.map...

返回以下错误:

Uncaught TypeError: Cannot read property 'map' of undefined

以下是conversations.json的内容:

{"user_has_unread_messages":false,"unread_messages_count":0,"conversations":[{"id":18768,"last_message_snippet":"Lorem ipsum","other_user_id":10193}]}

0
0 Comments

React state update issue是一个常见的React开发问题,它通常出现在更新组件的state时。这个问题的出现原因是在更新state时,可能会出现数据格式不正确的情况,导致组件的props为空,从而导致组件无法正确渲染。

解决这个问题的方法是将新的数据转换成一个数组,并使用concat方法将其与原有的数据合并。具体的代码如下:

var newData = this.state.data.concat([data]);
this.setState({data: newData});

需要注意的是,虽然这种方法可以解决一部分问题,但它只是掩盖了真正的问题,并不能解决根本的问题。在某些情况下,数据仍然可能出现格式不正确的情况,导致组件无法正常渲染。因此,建议只在数据格式正确的情况下使用这种方法,以避免出现意外的行为。

Facebook的ToDo演示应用程序中也使用了这种方法,可以参考该应用程序的相关部分。但需要注意的是,这仅仅是一种技巧,不适用于所有情况,需要根据具体情况进行判断和使用。

总之,解决React state update issue问题的关键是确保更新的数据格式正确,以避免组件无法正常渲染的情况发生。

0
0 Comments

React状态更新问题的原因是,data变量的格式不符合预期,它是一个对象{},而不是数组[]。

解决方法是将this.setState({data: data});修改为this.setState({data: data.conversations});,确保data变量的类型是一个数组。

下面是修改后的代码,还包括了一些建议(propType验证和clearInterval):

var converter = new Showdown.converter();
var Conversation = React.createClass({
  render: function() {
    var rawMarkup = converter.makeHtml(this.props.children.toString());
    return (
      

{this.props.id} {this.props.last_message_snippet} {this.props.other_user_id}

); } }); var ConversationList = React.createClass({ // 确保this.props.data是一个数组 propTypes: { data: React.PropTypes.array.isRequired }, render: function() { window.foo = this.props.data; var conversationNodes = this.props.data.map(function(conversation, index) { return ( last_message_snippet={conversation.last_message_snippet} other_user_id={conversation.other_user_id} ); }); return (
{conversationNodes}
); } }); var ConversationBox = React.createClass({ loadConversationsFromServer: function() { return $.ajax({ url: this.props.url, dataType: 'json', success: function(data) { this.setState({data: data.conversations}); }.bind(this), error: function(xhr, status, err) { console.error(this.props.url, status, err.toString()); }.bind(this) }); }, getInitialState: function() { return {data: []}; }, /* 取自https://facebook.github.io/react/docs/reusable-components.html#mixins 组件卸载后清除所有定时器 */ componentWillMount: function() { this.intervals = []; }, setInterval: function() { this.intervals.push(setInterval.apply(null, arguments)); }, componentWillUnmount: function() { this.intervals.map(clearInterval); }, componentDidMount: function() { this.loadConversationsFromServer(); this.setInterval(this.loadConversationsFromServer, this.props.pollInterval); }, render: function() { return (

Conversations

); } }); $(document).on("page:change", function() { var $content = $("#content"); if ($content.length > 0) { React.render( , document.getElementById('content') ); } });

0
0 Comments

React中的state更新问题是一个常见的错误,它通常出现在使用map函数时。在这种情况下,你需要将props.data转换成一个数组,然后才能使用map函数进行操作。

具体解决方法如下:

data = Array.from(props.data);

有时候,即使类型和长度都是正确的,仍然会出现错误。这可能是因为props.data本身已经是一个数组,但React无法正确识别它。使用上述方法可以解决这个问题。

希望这个解决方法对你有帮助!

0