Как передать реквизиты компоненту в React

#reactjs #react-component

#reactjs #react-компонент

Вопрос:

У меня есть 2 компонента страницы со своими собственными маршрутами. Есть один компонент заголовка, который должен использоваться на обеих страницах, и предполагается, что он изменяет свое содержимое в зависимости от того, на какой странице вы находитесь.

Как я могу изменить содержимое в заголовке для каждой страницы?

  return (
        <main className={theme.main}>
            <Header 
                title={this.state.headerTitle}
                boldTitle={this.state.boldTitle}
            />
            <div className={theme.content}>
                <Switch>
                    <Route path={'/page1'} component={Page1} />
                    <Route path={'/page2'} component={Page2} />
                </Switch>
            </div>
            <Footer/>
        </main>
    );
  

Я пытаюсь передать реквизиты в заголовок на моей странице маршрутов, как в приведенном ниже коде.

 <Route path={'/page2'} component={Page2} currentTitle={this.state.headerTitle} />
  

Обновить

Я получил это, исправил это с помощью import { withRouter } from "react-router"; и

export default withRouter(Header);

затем в компоненте Header он прослушивает маршруты, и я могу указать путь для выполнения того, что мне нужно.

Тогда мне не нужно состояние set up, просто прослушайте маршруты внутри этого MyComponent. Usign: this.props.location

Ответ №1:

ПЕРЕМЕСТИТЕ СВОЙ ЗАГОЛОВОК ВНУТРИ страниц1 И Page2.

 <Route path={'/page2'} component={() => <Page2  currentTitle={this.state.headerTitle} 
 />} />
  

Затем в заголовке используйте currentTitle для изменения заголовка.

Ответ №2:

Поместите заголовок в его собственный компонент и импортируйте его отдельно в каждый компонент страницы.

Затем вы можете передавать реквизиты в заголовок, подобный этому, при вызове заголовка на каждой странице…

 import Header from (wherever that component is)

class Page# extends React.component {

other code

render() {
return (
         <div>
           <Header currentTitle="this.state.headerTitle" />
           <rest of code for this page /> 
         </div> 
}
  

или любой другой реквизит, который вам нужен.

Ответ №3:

Я предполагаю, что код, который вы показываете, находится внутри render() метода некоторого компонента React, так что у вас действительно есть состояние.

Обратите внимание, что component атрибут в Route теге ожидает значение, которое является функцией без аргументов. Компонент, который будет отображаться, является результатом функции. Но ничто не запрещает вам проделать некоторую работу, прежде чем возвращать значение. Я бы попробовал что-то вроде этого

 <Route path={'/page1'} component={() => {
    this.setState({headerTitle: ...what you want..., boldTitle: ...what you want...})
    return <Page1 />
}}/>
  

Если Page1 это просто функция, измените строку «return» на return Page1()

Надеюсь, это поможет — Carlos

Комментарии:

1. Спасибо, Карлос, я вставил это, но у меня не получилось. Моя страница 1 — это класс, который расширяет component.

Ответ №4:

вы можете использовать библиотеку redux в качестве глобального состояния

что-то вроде этого

  class Main extends Component{
    render(){
    return (
            <main className={theme.main}>
                <Header 
                    title={this.props.headerTitle}
                    boldTitle={this.state.boldTitle}
                />
                <div className={theme.content}>
                    <Switch>
                        <Route path={'/page1'} component={Page1}/>
                        <Route path={'/page2'}component={Page2}
                        />
                    </Switch>
                </div>
                <Footer/>
            </main>
        )
    }
    const mapStateToProps = state =>{
     return {     headerTitle: state.headerTitle    }
    }
    export default connect(mapStateToProps)(Main)
  

Страница 1

  class Page1 extends Component{    
    changeTitle =()=>{
     this.props.actions.changeTitle("title from Page1")
    }
    render(){
    return (
    <div>
    <button onClick={this.changeTitle}>changeTitle</button>
    </div>
    )
    }
    const mapDispatchToProps = (dispatch)=> {
        return {
            actions: bindActionCreators({ changeTitle }, dispatch)
        }
    }
    export default connect(null, mapDispatchToProps)(Page1)
  

этот код не работает, но это идея, как вы можете использовать redux для этой цели

Комментарии:

1. Спасибо Davida, но я не использую redux для этого.