【问题标题】:Passing a function and a prop to another component but getting undefined将函数和道具传递给另一个组件但未定义
【发布时间】:2020-04-08 04:35:08
【问题描述】:

这只是粗略的代码,试图确保在每个组件之间发送数据,所以这是我的测试(文件:navbar.js)

import React from 'react';
import {Nav,} from 'react-bootstrap';
import styles from 'styled-components';
import Layout from './layout';
import Reports from './reports';



const Navbar =() =>{

    function handler(x){
    
        if (x==1){
            return <Reports></Reports>
        }
    }
    return(
    
    <Nav defaultActiveKey="/" className="flex-column" onSelect={(selectedKey) => <Layout page={selectedKey} func={handler}></Layout>}>
        <Nav.Link href="/">Home</Nav.Link>
        <Nav.Link href="/Orders">Orders</Nav.Link>
        <Nav.Link href="/Users">Users</Nav.Link>
        <Nav.Link eventKey='1' href="/Reports">Reports</Nav.Link>
    </Nav>

    )

}

export default Navbar;

现在布局类在尝试访问道具时出现问题(文件:layout.js)

import React, { Component } from 'react';
import {Nav, Col , Row, Container} from 'react-bootstrap';
import styles from 'styled-components';
import Navbar from './navbar';



class Layout extends Component{
    
    render(){
        
        return(
            <Container fluid>
                <Row>
                    <Col xs={3}>
                    <Navbar>
                    </Navbar>
                    
                    </Col>
                    <Col>
                        {this.props.func(this.props.page)}
                        column 2
                    </Col>
                </Row>
            </Container>

        )
    }

}

export default Layout;

我试图完成的是通过使用处理程序返回从导航中选择的组件,以获取单击后存储在 selectedKey 中的 eventKey,当前正在尝试为报告页面执行此操作。

【问题讨论】:

  • 你有什么错误吗?
  • × TypeError: this.props.func 不是函数 Layout.render | ^ 22 | {this.props.func(this.props.page)} 23 |第2 24栏| 所以基本上我称为 func 的函数没有到达布局组件,prop 也没有被命名为 page
  • 好的,看我的回答。

标签: reactjs undefined react-props react-component


【解决方案1】:

您可以将 JSX 作为子组件传递,然后在需要的地方使用它们,为什么不在父组件本身中调用该函数呢?

试试这个:

const Navbar = () => {

  const handler = (x) => {
    if (x == 1) {
      return <Reports></Reports>
    }
  }
  return (
    <Nav defaultActiveKey="/" className="flex-column" onSelect={(selectedKey) => <Layout >{handler(selectedKey)}</Layout>}>
      <Nav.Link href="/">Home</Nav.Link>
      <Nav.Link href="/Orders">Orders</Nav.Link>
      <Nav.Link href="/Users">Users</Nav.Link>
      <Nav.Link eventKey='1' href="/Reports">Reports</Nav.Link>
    </Nav>

  )
}

class Layout extends Component {

  render() {
    return (
      <Container fluid>
        <Row>
          <Col xs={3}>
            <Navbar>
            </Navbar>
          </Col>
          <Col>
           {this.props.children}
          </Col>
        </Row>
      </Container>
    )
  }
}

【讨论】:

  • {this.props.children} 登录到控制台时仍然显示未定义
  • @TroySmith 确保 handler(selectedKey) 返回一些 JSX。
  • 感谢帮助我解决了这个问题我有两个组件实例,所以我只需要使用第一个组件而不是第二个来进行更新
【解决方案2】:

如果您想根据选定的页面值进行渲染,您可以执行此显示逻辑,只需通过 window.location.pathname 获取当前路径,因为 href 会将您的 url 更改为该路径,并且根据路径值渲染各个组件

        function handler(){

        const page = window.location.pathname; // this will return current page path

        if (page==="/")
          return (<HomePage/>)
        else if (page === "/Orders")
          return(<Orders/>)
        else if (page === "/Reports")
          return (<Reports/>)
  }

希望这会有所帮助!

更新: 尝试将您的函数绑定到这样的类

const Navbar =() =>{
 constructor(props){
 super(props);
 this.handler = this.handler.bind(this);
 }
}

【讨论】:

  • 如果正在调用该函数,这将起作用,但它表示我传递给布局组件的 func 不是函数。 {this.props.func(this.props.page)} @Ibrahim
  • 嗨,汤姆!尝试将 NavBar 中的处理函数绑定到类的实例 (this) Code ==> constructor(props){ super(props); this.handler = this.handler.bind(this); }
  • 我刚刚发现您不需要将“箭头函数”绑定到类的实例。虽然很奇怪
  • 我将导航栏转换为类组件并在布局组件中进行了构造函数并进行了调用,但无论我做什么我的道具都没有显示在布局组件中,它都是未定义的
猜你喜欢
  • 1970-01-01
  • 2019-07-11
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-29
相关资源
最近更新 更多