【问题标题】:Proper way to get URL params on React component mount?在 React 组件挂载上获取 URL 参数的正确方法?
【发布时间】:2018-04-23 00:17:51
【问题描述】:

我有一个想要获取 URL 参数的组件(例如,a1 和 a2)。如果这些包含任何内容,我想将一些本地状态设置为它们的值,以便可以在页面上呈现内容。我正在使用react-router-domwithRouter HOC,所以我可以从props 访问location,但我不确定我是否可以使用它。现在我有:

class Example extends Component {
    constructor(props) {
    super(props);

    this.state = {
      a1: null,
      a2: null,
    }
  }

  componentDidMount() {
    console.log(window.location.search);
    const parsed = querystring(window.location.search);
    this.setState({
      a1: parsed.a1,
      a2: parsed.a2,
    })
  }
}

现在,这样做会给我一个 Do not use SetState in ComponentDidMount 的 ESLint 警告。我已经进行了一些搜索,这在来自componentDidMount 的回调中显然是“可以”做的,但这不是回调,所以我不确定它是否“可以”。

那么在这里做什么是正确的?我是否忽略警告(并获得双重渲染)?有没有其他方法可以正确获取 URL 参数并将它们设置为本地状态?

我也不想使用任何将在 React 17 中被弃用的方法,因为那只是意味着在升级时重写它......

【问题讨论】:

  • 有什么理由不能使用componentWillMount
  • componentWillMount 已弃用,将在 React 的下一个主要版本中删除

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


【解决方案1】:

您将这些值存储在状态中是否有特殊原因?

你说它是“这样可以在页面上呈现东西”

但是,您不需要为此使用状态。在render(),您可以访问和使用this.props

【讨论】:

  • 如果你不存储在 state 中,那么你不必担心它与 url 保持同步。
  • 基思所说的。我的意思是,从技术上讲是的,我可以使用 URL 作为信息的“状态”,但这似乎是错误的。如果有人从带有参数的现有共享链接访问我的网站,我希望它初始化我的值(随后可以随着 UI 交互而改变)。
【解决方案2】:

您应该改用componentWillMount 方法。这将是准备性设置,一旦设置了状态,您的组件就可以正常渲染,不像 componentDidMount 的情况下重新渲染。

如果你不想使用 componentWillMount 因为将来会被弃用(UNSAFE_ 即使在 React 17 之后仍然有效),你也可以在 constructor 本身中设置 url 参数,因为这是常量值并且根本不改变。

【讨论】:

  • 我不想使用将在 React 17 中弃用的组件。
  • 即使 componentWillMount 没有消失,如果您从那里设置状态,它实际上并不会阻止组件重新渲染。
  • componentWillMount 无法重新渲染,因为此时组件尚未渲染一次。
  • 如果你没有做任何大事,就像这个例子一样,componentWillMount肯定会在渲染之前完成。
猜你喜欢
  • 1970-01-01
  • 2020-01-09
  • 1970-01-01
  • 2020-11-10
  • 2017-01-14
  • 1970-01-01
  • 2021-12-08
  • 2014-03-27
  • 1970-01-01
相关资源
最近更新 更多