【问题标题】:How to force a re-render of React-Redux components upon React-Router-Dom NavLink click?如何在 React-Router-Dom NavLink 单击时强制重新渲染 React-Redux 组件?
【发布时间】:2019-01-13 19:29:36
【问题描述】:

我有一个使用 React-Router-Dom 构建的 React 应用程序用于导航。这些页面非常重视可以以 CRUD 形式打开的数据表的使用。由于我们在表中拥有大量记录,因此用户对表应用排序、过滤和分页以找到所需记录的情况并不少见。

作为一个相当标准的 Web 应用程序,我们在页面左侧有一个导航栏。这是由NavLinks 组成的。

应用程序的主体是一个组件,MainPanel,它几乎完全是Switch 中的一系列Route 组件:

  <Switch>
    <Route path="/page1" component={ComponentOne} />
    <Route path="/page2" component={ComponentTwo} />
  </Switch>

我现在有一个来自上面的请求,当用户选择其中一个 NavLink 时,它应该充当页面主体中所有内容的“重置”。特别是,这应该作为表的所有设置(排序、过滤、页面等)的“重置”。

似乎几乎应该是微不足道的,因为我所要做的就是触发包含表格的页面的主面板的重新呈现。但是,我在 React-Router-Dom 的文档中找不到任何关键的东西。

有人知道我错过了什么吗?有没有简单/正确的说法,“点击此链接时,总是重新渲染 MainPanel?

【问题讨论】:

  • 任何答案对你有用吗?

标签: javascript reactjs react-router react-redux react-router-dom


【解决方案1】:

您可以将值保持在状态中,例如称为panelKey,用作主面板的key 道具。然后在单击链接时给panelKey 一个新值,React 将丢弃主面板并创建一个全新的组件。

示例

class Timer extends React.Component {
  timer = null;
  state = { count: 0 };

  componentDidMount() {
    this.timer = setInterval(() => {
      this.setState(prevState => ({ count: prevState.count + 1 }));
    }, 1000);
  }

  componentWillUnmount() {
    clearInterval(this.timer);
  }

  render() {
    return <div>{this.state.count}</div>;
  }
}

class MainPanel extends React.Component {
  state = { panelKey: 1 };

  onClick = () => {
    this.setState(prevState => ({ panelKey: prevState.panelKey + 1 }));
  };

  render() {
    return (
      <div key={this.state.panelKey}>
        <button onClick={this.onClick}> Reset Panel </button>
        <Timer />
      </div>
    );
  }
}

ReactDOM.render(<MainPanel />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id="root"></div>

【讨论】:

  • 将此标记为正确答案,因为它有效,它只需要稍微调整即可解决一些问题。
【解决方案2】:

我看到你已经在标签中列出了 react-redux,为什么不发送一个自定义操作来通知其他组件应该重置过滤器?

import { LOCATION_CHANGE } from 'react-router-redux';
import { resetFilter } from './filterActions.js';

const resetFilterMiddleware = ({ dispatch }) => next => action => {
    // Listen for a location chnage
    if(action.type === LOCATION_CHANGE){
        dispatch(resetFilter()); // { type: 'RESET_FILTER' } or something along the lines
    }

    next(action);
}

export default resetFilterMiddleware;

【讨论】:

  • 我认为这不会起作用,因为没有位置变化;我们正在谈论选择相同的链接,它永远不会触发该事件。
  • 这取决于您实现导航的方式,如果您使用的是dispatch(push('/example')),那么无论用户是否在同一页面上,它都会起作用
猜你喜欢
  • 1970-01-01
  • 2018-10-28
  • 2019-07-14
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 2021-11-16
  • 2018-03-24
  • 1970-01-01
相关资源
最近更新 更多