Реагирует на повторный рендеринг компонента при изменении реквизита

#reactjs #components #render

#reactjs #Компоненты #рендеринг

Вопрос:

У меня есть панель вкладок в моем компоненте Tabbar, в котором я изменяю индексные реквизиты :

 class Tabbar extends Component {

state = {
    index: this.props.index,
    name: this.props.name,
    image: this.props.image
};

changeTabs = () => {
    this.setState({index: this.props.index});
}

render() {
    return (
        <React.Fragment>    
        <div id={this.state.index} className="col">
            <button onClick={this.changeTabs}></button>
        </div>
        </React.Fragment>
        
    );

}

}

export default Tabbar;
  

А затем в моем другом компоненте я хочу повторно отобразить фрагмент после изменения реквизита. Вот мой код :

 import Tabbar from './Tabbar';

class Tabview extends Component {

    constructor(props) {
        super(props);
        this.state = {
            tabs: [
                {index: 0, name: "tab0", image:require('../Assets/profile.svg'),childView: {ProfilePage} },
                {index: 1, name: "tab1", image:require('../Assets/home.svg'),childView: {HomePage}},
                {index: 2, name: "tab2", image:require('../Assets/blog.svg'),childView: {BlogPage}},
              ],
        }
    }

    handleRender = () => {
        this.state.tabs.map(item => {
            if (item.index === this.props.index) {
                return <item.childView/>;
            }
        })
        return <BlogPage/>;
    }


    render() {

        return (
        <div>
            <Header/> 

            {this.handleRender()}
            {this.state.tabs.map(item => 
                        <Tabbar key={item.index} index={item.index} name={item.name} image={item.image}/>
                    )}


    
        </div>
            

        );

    }

}

export default Tabview;
  

Метод «handleRender» должен обрабатывать рендеринг.
Я пытался использовать «componentDidMount» или «componentDidUpdate», но у меня не получилось.

Как я могу заставить его работать?

Заранее благодарю вас!

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

1. Где вы используете панель вкладок?

2. @GuruparanGiritharan в методе рендеринга я отредактировал код.

3. Вы хотите изменить состояние родительского элемента? как активная вкладка

4. @GuruparanGiritharan Да, и после этого измените дочерний элемент его отображения на основе выбранной вкладки.

5. пожалуйста, проверьте мой ответ

Ответ №1:

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

 import React, { Component } from "react";

class Tabbar extends Component {
  render() {
    return (
      <React.Fragment>
        <div id={this.props.index} className="col">
          <button
            onClick={() => this.props.changeTabs(this.props.index)}
          ></button>
        </div>
      </React.Fragment>
    );
  }
}

export default Tabbar;
  

И в родительском вы поддерживаете активное состояние индекса

 import Tabbar from "./Tabbar";
import React, { Component } from "react";

class Tabview extends Component {
  constructor(props) {
    super(props);
    this.state = {
      tabs: [
//your tabs
      ],
      activeIndex: 0
    };
  }

  handleRender = () => {
    this.state.tabs.map((item) => {
      if (item.index === this.state.activeIndex) {
        return <item.childView />;
      }
    });
    return <div />;
  };

  render() {
    return (
      <div>
        {this.handleRender()}
        {this.state.tabs.map((item) => (
          <Tabbar
            key={item.index}
            index={item.index}
            name={item.name}
            image={item.image}
            changeTabs={(index) => this.setState({ activeIndex: index })}
          />
        ))}
      </div>
    );
  }
}

export default Tabview;
  

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

1. Лучше иметь функцию handlerender, как показано ниже, где вы находите элемент на основе активной вкладки и показываете handleRender = () => { const item = this.state.tabs.find((item) => { return item.index === this.state.activeIndex; }); если (элемент) возвращает <span>{item.name }</span>; else возвращает <div />; };

2. Я ценю вашу помощь, но ваш ответ тоже не работает.

3. попробуйте эту песочницу codesandbox.io/s/festive-glade-t4yvw

4. @hamedjvh ты пробовал?