【问题标题】:setState not rendering with immutablesetState 不使用不可变渲染
【发布时间】:2017-06-08 09:36:49
【问题描述】:

我有这个代码 它的功能是搜索和过滤,数据来自this.props.allList,但是它不起作用我认为错误是在状态但我不确定

// 组件.jsx '使用严格';

import React, {Component} from 'react';
import PureRenderMixin from 'react-addons-pure-render-mixin'; 
import Immutable from 'immutable';    


export default class ListComponent extends Component { 

 constructor(props) {
    super(props);
    this.state = { 
      allList: Immutable.List(),
      filteredData: Immutable.List(),
    };
    this.shouldComponentUpdate = PureRenderMixin.shouldComponentUpdate.bind(this);

  }

  componentWillMount() {
    this.setState({ 
      allList: Immutable.fromJS(this.props.allList).toList(),
      filteredData: Immutable.fromJS(this.props.allList).toList() 
    });
  }

  filterData(event) {
    event.preventDefault();
    const regex = new RegExp(event.target.value, 'i');
    const filtered = this.state.allList.filter(function(datum) {
      return (datum.get('name').search(regex) > -1);
    });

    this.setState({
      filteredData: filtered,
    });
  }

  render() {
    const { filteredData } = this.state;
    const prettyRows = filteredData.map(function(datum) {
        return (
        <tr>
      <td>{ datum.get("status") }{datum.status}</td>
      <td>{ datum.get("count") }{datum.count}</td>
    </tr>
   );

    });
    return(
      <div>
        <input
          type="text"
          className="form-control"
          onChange={ this.filterData.bind(this) }
          placeholder="Search" />
        <table
          <thead>
          <tr>
              <th>id </th>
              <th>Name</th>
            </tr>
          </thead>

          <tbody>
            { prettyRows }
          </tbody>
       </table>
     </div>);
   }
 }

json

{
  "count": 3,
  "status": "SUCCESS",
  "tours": [
    {
       "title": "item 1",
    },
    {
       "title": "item 2",
    },
    {
       "title": "item 3",
    },

  ]
}

这里是密码笔:http://codepen.io/fernandooj/pen/WROpeg 感谢您的帮助

【问题讨论】:

  • 这是您的代码的精确副本吗?如果是这样,您的渲染方法中有无法访问的代码。在您声明 { filteredData } = this.state; 后,您有一个 return ( ) 包装了 map 函数,因此代码停止执行并返回该映射。作为要渲染的内容
  • 对不起,我这里的渲染不好,修改代码但还是没有渲染

标签: reactjs redux state immutable.js


【解决方案1】:
  1. 我在您的代码中注意到的第一件事是您正在使用 React.render,

    React.render(&lt;App /&gt;, document.getElementById('app'));

    这应该是 ReactDOM.render React Docs

  2. 这是一个 codepen,其中包含您的代码的工作版本,但不包含 Immutable。

  3. 这是一个 codepen ,其工作不可变。

注意事项:
只有 List 是 Immutable 结构,而不是其中的对象,所以不必使用 datam.get('name'),datam.name 有效。

  1. “我需要状态,以便能够进行粗加工、列出、修改、消除” 我认为您的意思是您想使用 react 组件状态,以便在组件 ui 级别执行过滤,同时在商店中保留原始完整的选项(数据)列表?如果您的目标是保持存储状态最小化,那么您的数据流应该如下所示:
    1. Action 在组件中调度 -> 必要时更新商店 ->
    2. Reducer 返回商店的部分 与相关信息 ->
    3. Selector 对数据进行计算并返回 过滤/减少/计算的数据到视图。 注意:Reselect 是一个很好的工具。

这有助于您将商店保持为“单一事实来源”,并保持组件“干燥”。

【讨论】:

  • 嗨,感谢您的帮助:我认为这不是问题,我认为问题在于我将 json 置于状态
  • 嗨,感谢您的回答,这实际上是我正在寻找的,现在我有另一个问题,当我将它传递给我的测试环境时,我从 redux 获取数据,并将其保存在存储,但是那样它对我不起作用,如果我执行 console.log (this.Props.list) 加载我,但如果我执行 console.log (this.state.list) 不加载我,你知道为什么它可以是
  • 是的,不用担心。通常,当您使用商店时,您会尽量减少在 React 组件中使用状态的次数。我必须查看您的代码,但如果您还没有使用它们,我发现一些非常有用的工具是 React Dev ToolsRedux Dev Tools。此外,如果您想分享您的项目,webpackbin 非常强大。
  • 嗨,看看我的项目是这样的:stackoverflow.com/questions/41750483/…
  • 快速提问,如果您的商店正常运行,为什么还需要使用 state?
【解决方案2】:

问题可能是由变量prettyRows 引起的。问题可能是由于没有变量datum.get("status"), or datum.status

能否提供更多信息,例如控制台中的错误?

【讨论】:

  • 感谢您的帮助,我没有错误,如果我把console.log (this.props.allList) 给我带来了很好的json,但是在渲染的时候不起作用
  • 问题:如果您在映射项目中调用{datum.status},为什么需要使用{ datum.get("status") }?如果我没记错的话,data.status 应该已经是这个值了。也许在 datum 下添加一个调试器或 console.log 来检查试图返回的值。
【解决方案3】:

您的反应包括错误: http://codepen.io/anon/pen/rjwwMq

等一下

【讨论】:

  • 嗨,感谢您的帮助,但过滤器还没有工作
猜你喜欢
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 2021-06-22
  • 2016-09-09
  • 2016-05-19
  • 2019-09-26
  • 2019-12-13
  • 1970-01-01
相关资源
最近更新 更多