javascript - 当我使用 Route 时,为什么我的 props 未定义?

标签 javascript reactjs ecmascript-6

在将 props 重新传递给 child 时(特别是在 Route 内),我很困惑。例如:

class App extends Component {
    constructor(props) {
        this.sayHi = this.sayHi.bind(this);
    }

    sayHi() {
        console.log('hi')
    }

    render() {
        return (
          <Router>
            <Route path="/projects" component={(props, state, params) => 
              <ProjectList 
                sayHi={this.sayHi}
              {...props} />} 
            />
          </Router>
        )
    }
}

const ProjectList = (props) => {
    return (
        <Route path={`${props.match.url}/:id`} component={(props, state, params) => 
          <ProjectDetail 
            sayHi={props.sayHi}
          {...props} />} 
        />
    )
}

const ProjectDetail = (props) => {
    console.log(props)
}

ProjectList 组件中,访问 sayHi 方法没有问题(我可以将其附加到该组件内的 onClick 事件) ,但在 ProjectDetail 组件中,我得到一个未定义的 props.sayHi

我如何错误地传递了这个 Prop ?

最佳答案

您只是遇到了同名参数的问题。在您的 ProjectList 组件中:

<Route path={`${props.match.url}/:id`} component={(props, state, params) => 
    <ProjectDetail 
         sayHi={props.sayHi}
    {...props} />} 
/>

当您创建 ProjectDetail 元素并传递 sayHi 属性时,您必须访问ProjectList 的属性,而不是箭头函数的 Prop ( Prop Route passes )。这些参数相互“覆盖”,因为它们具有相同的名称 props。所以,尝试:

const ProjectList = (props) => {
    return (
        <Route path={`${props.match.url}/:id`} component={(routeProps, state, params) => // use name "routeProps" instead of "props"
            <ProjectDetail 
                sayHi={props.sayHi}
            {...props} />} 
        />
    )
}

我们将 component 属性的箭头函数中的 props 重命名为 routeProps 这将消除名称冲突。这样,ProjectList 的 props 就会传递给 ProjectDetail,而不是 Route 传递的 props。

关于javascript - 当我使用 Route 时,为什么我的 props 未定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43104253/

相关文章:

javascript - JavaScript中如何匹配字符组的差异?

javascript - 具有智能感知的基于 Web 的 html、javascript、jquery 和 css 编辑器?

reactjs - 在 useEffect React 中调用异步函数中的 Firebase v9 onSnapShot

node.js - 如何将 MERN 堆栈部署到托管服务?

javascript - 对空字符串使用条件渲染

javascript - 如何将两个数组与ES6中的类型和键值合并

javascript - 我如何将此要求转换为 ES6 导入样式

javascript - 如何在 Immutable.Map({}) 中更改 ImmutableList({}) 中项目的属性

javascript - 在 Jquery 或重复代码中将列表作为参数传递

javascript - 如何通过其名称作为字符串来调用函数?