RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 631360
Accepted
while1pass
while1pass
Asked:2020-02-23 01:17:44 +0000 UTC2020-02-23 01:17:44 +0000 UTC 2020-02-23 01:17:44 +0000 UTC

使用动态 url 进行路由时,componentDidMount() 不起作用

  • 772

componentDidMount()为什么当我尝试再次调用该组件时它可能无法在 React 容器中工作?

有一个链接列表,例如

<Link key={element.name} to={'elements/:element'}} />

我从链接中获取此元素的名称并将其传递给 props 中的 ElementDetail 容器(有条件地)

<ElementDetail name={:element} />

name从props我已经使用内部方法componentDidMount():

@connect(
    state => ({ element: state.element }),
    dispatch => ({elementActions: bindActionCreators(elementActions, dispatch)})
)
export default class ElementDetail extends React.Component {
    componentDidMount() {
        console.log('>>> CDM')

        let { getProperties } = this.props.elementActions;
        getProperties(this.props.name)
    }

    render() {
        let { properties, isLoading } = this.props.element;
        let propertyGroups = properties['properties'];

        console.log('>>> RENDER')

        return <div />

首次安装组件时,代码按预期工作。

但是,当我尝试通过 Link 使用不同的数据再次调用 c 组件时,我只会在浏览器和props.name. 只有 render() 中的代码有效,我可以从控制台输出中看到这一点。我在哪里犯了错误?

reactjs
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Nick
    2020-02-23T01:28:02Z2020-02-23T01:28:02Z

    没有完整的代码不好说,但是很明显这个组件不是在第二次初始化,而是在更新。这可以签入componentWillReceiveProps()。如果第二次调用componentWillReceiveProps()而不是componentDidMount(),那么您需要使用componentWillReceiveProps()。

    事实是,当发送新props的时,组件不会重新初始化,而只会接收新的props。

    组件挂载后立即调用 componentDidMount()

    componentWillReceiveProps() 在挂载的组件接收新的 props 之前被调用

    • 3
  2. while1pass
    2020-02-23T06:06:24Z2020-02-23T06:06:24Z

    找到了两个解决方案。

    首先,我向组件添加了一个键属性,键发生了变化(我从路由中获取),这导致重新挂载组件的反应

    let name = this.props.params.element;
    ...
    <ElementDetail name={name} key={name} />
    

    每次更改键调用 ComponentDidMount()

    @connect(
        state => ({ element: state.element }),
        dispatch => ({elementActions: bindActionCreators(elementActions, dispatch)})
    )
    export default class ElementDetail extends React.Component {
        componentDidMount() {
            let { getProperties } = this.props.elementActions;
            getProperties(this.props.name)
        }
        
        ...
    

    其次是使用 componentWillReceiveProps() (感谢Nick的提示)

    let name = this.props.params.element;
    ...
    <ElementDetail name={name} />
    

    在组件本身

    @connect(
        state => ({ element: state.element }),
        dispatch => ({elementActions: bindActionCreators(elementActions, dispatch)})
    )
    export default class ElementDetail extends React.Component {
        componentWillReceiveProps(nextProps) {
            if (nextProps.name !== this.props.name) {
                let { getProperties } = this.props.elementActions;
                getProperties(nextProps.name)
            }
        }
    
        componentDidMount() {
            let { getProperties } = this.props.elementActions;
            getProperties(this.props.name)
        }
    
    
    ...
    

    但是第二种方法有更多的代码并且是重复的。

    如果有人给出他们的解释和评论,那就太好了。

    • 2

相关问题

  • 如何正确连接 React 到站点?

  • 为什么写成普通函数的组件会返回空

  • defaultProps 与 state 有何不同?

  • 如何在 Meteor+React 应用程序中连接和使用 Yandex.Metrica?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5