如何访问传递给 React.Component 的道具

How can I access props passed to React.Component

我想在我的 React 应用程序的根层中制作一些道具:

import React from 'react'
import App, { Container } from 'next/app'

export default class MyApp extends App {
  static async getInitialProps({ Component, router, ctx }) {
    let pageProps = {}

    if (Component.getInitialProps) {
      pageProps = await Component.getInitialProps(ctx)
    }

    return { pageProps }
  }

  state = {
    language: "pl"
  };

  render () {
    const { Component, pageProps } = this.props

    return (
      <Container>
        <Component lang={this.state.language} />
      </Container>
    )
  }
}

所以每个新创建的 React.Component 都应该继承那些 props。但我不确定如何获得它们。假设我有另一个组件 <Nav/>.

我不应该可以通过props.lang里面的Nav得到它吗? 当我尝试时它说 lang undefined.

我在您的代码示例中发现了几个问题。

首先props是您组件上的属性,应通过this.props.

访问它们

下面是一个将 props 传递给子组件的基本示例:

import React, { Component } from 'react';

class App extends Component {
  render() {
    const greeting = 'Welcome to React';

    return (
      <div>
        <Greeting greeting={greeting} />
      </div>
    );
  }
}

class Greeting extends Component {
  render() {
    return <h1>{this.props.greeting}</h1>;
  }
}

export default App;

使用上面的代码示例,您的错误似乎是使用 return <h1>{props.greeting}</h1>; 而不是 return <h1>{this.props.greeting}</h1>;

其次,看来你的组件设置有点不对。我希望您的组件声明看起来像这样:

class Clock extends React.Component {
  constructor(props) {
    super(props);
    this.state = {date: new Date()};
  }

  render() {
    return (
      <div>
        <h1>Hello, world!</h1>
        <h2>It is {this.state.date.toLocaleTimeString()}.</h2>
      </div>
    );
  }
}

在您的代码示例中,没有构造函数,并且 state 似乎没有设置为组件的 属性。

在示例 <Nav/> 组件中,如果您希望访问 this.props,则必须在组件函数中指定至少一个参数。例如:

const Nav = (props) => ( <div> {this.props.lang} </div> )

希望对您有所帮助!

以上我的评论总结:

Did you try props.lang, or, this.props.lang?

因为您需要 this.props.lang 才能访问 属性。

Hrm, just took a quick peek at my own code -- the initial state is set in constructor(props), and is defined like super(); this.state = (somestate);.

因为需要在类的构造函数中设置状态。

我建议将 language 移动到 React Context API

这样你就创建了一个上下文

// context.js
import React from 'react';

export const LangContext = React.createContext('pl');

并在_app.js

内提供
// app.js
import React from 'react';
import App, { Container } from 'next/app';
import { LangContext } from '../context';

export default class MyApp extends App {
  static async getInitialProps({ Component, router, ctx }) {
    let pageProps = {};

    if (Component.getInitialProps) {
      pageProps = await Component.getInitialProps(ctx);
    }

    return { pageProps };
  }

  state = {
    language: 'EN'
  };

  render() {
    const { Component, pageProps } = this.props;

    return (
      <Container>
        <LangContext.Provider value={this.state.language}>
          <Component {...pageProps} />
        </LangContext.Provider>
      </Container>
    );
  }
}

并且无论何时您需要访问 language 值,您都不需要再传递它。它将在 LangContext 上可用。用法示例

// Nav.js
import Link from 'next/link';
import { LangContext } from '../context';

function Nav() {
  return (
    <LangContext.Consumer>
      {lang => {
        return (
          <div className="site-nav">
            <Link href="/">
              <a>index</a>
            </Link>
            <Link href="/about">
              <a>about</a>
            </Link>
            language = {lang}
          </div>
        );
      }}
    </LangContext.Consumer>
  );
}

export default Nav;

这有助于解决将 lang props 传递给页面然后传递给 Nav 等特定组件的问题。如果需要,只需将组件包装到 <LangContext.Consumer> 中即可。

示例index.js页面

// index.js
import Nav from '../components/Nav';

export default () => (
  <div>
    <Nav />
    <hr />
    Welcome to index.js!
  </div>
);

** 注意:据我所知,您只能在 _app.js

中使用 <SomeContext.Provider>