在React中更改渲染的映射数组的排序键

时间:2017-10-04 08:42:09

标签: javascript reactjs sorting

我希望客户端排序能够让用户按不同的键进行排序。键只是整数。

现在我在map函数之前调用我的sort函数:

.sort(function(a, b) {
        return b.sortKey- a.sortKey;
      }

当用户按下按钮时,sortKey应更改为指定值。这都包含在反应组件中,而不是函数中。我读到组件本身不应该更改组件上的属性,那么如何在按下按钮时更改sortKey呢?

我的渲染功能包含两个排序选项和列表:

render() {
    return (
      <div className="row">
        <div className="col s12">
          <button onClick={() => this.changeSortKey("yes")} style={{ marginRight: 5, marginTop: 5 }} className="btn">
            Yes Votes
          </button>
          <button onClick={() => this.changeSortKey("no")} style={{ marginTop: 5 }} className="btn">
            No Votes
          </button>
        </div>

        {this.renderSurveys()}
      </div>
    );
  }

changeSortKey(key)函数理想情况下会更改sortKey,然后重新呈现列表,但我不确定在用户点击后如何再次呈现列表。

如果我只使用已知密钥提供sort函数,则排序工作正常。

编辑:从API中获取数据

export const fetchSurveys = () => async dispatch => {
  const response = await axios.get("/api/surveys");
  dispatch({ type: FETCH_SURVEYS, payload: response.data });
};

编辑:RenderSurveys辅助函数

renderSurveys() {
    //custom helper method
    return this.props.surveys
      .sort(function(a, b) {
        return b.yes - a.yes;
      })
      .map(survey => {
        const data = [
          { text: "Yes", value: survey.yes },
          { text: "No", value: survey.no }
        ];
        //reverse the array and then map over it, newest first
        return (
          <div className="col s6">
            <div key={survey._id} className="card darken-1">
              <div className="card-content">
                <span className="card-title">{survey.title}</span>
                <p>Sent On: {new Date(survey.dateSent).toLocaleDateString()}</p>
                <p>
                  Last responded on:{" "}
                  {new Date(survey.lastResponded).toLocaleDateString()}
                </p>
              </div>

              <div className="card-action">
                <a href="#">Yes: {survey.yes}</a>
                <a href="#">No: {survey.no}</a>
                <BarChart width={100} height={70} data={data} />
                <button
                  onClick={() => this.props.deleteSurvey(survey._id)}
                  className="btn-floating btn-large red right"
                >
                  <i className="material-icons">clear</i>
                </button>
              </div>
            </div>
          </div>
        );
      });
  }

2 个答案:

答案 0 :(得分:1)

如果将已排序的数据版本存储在状态中,则在重新排序然后将其设置为状态时,将使用新的排序数组呈现组件。

答案 1 :(得分:1)

我会这样做:

  1. 首先,在您的componentWillMount方法中,我会将您的投票存储在州内。

  2. 然后,当您的用户点击该按钮时,将投票值存储在let变量上并对该变量进行排序。

  3. 最后,使用新的排序数组更新您的状态。

  4. 这样,每次对数组进行排序时,组件都会重新渲染:

    =TEXT(A1,"hh:mm:ss")&" " &TEXT(B1,"hh:mm:ss")
    

    请记住,当您必须在许多视图之间共享数据时,Redux会变得很方便,但如果您只是在单个视图中显示数据,那么使用组件状态会更有用。

    我会使用redux来长期存储de值并将它们存储在你的应用程序中,但是操作显示该数据的状态。