如何访问传递给 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>
我想在我的 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>