Как получить доступ к состоянию одного компонента или констант одного компонента в другом компоненте (не родительском дочернем элементе) - React - PullRequest
0 голосов
/ 10 декабря 2018

Я работаю над React Table.Я в основном новичок в React.У меня есть страница панели инструментов, где я отображаю таблицу реакции из 8 столбцов.У меня есть кнопка настройки, которая открывает всплывающую страницу, эта всплывающая страница имеет 8 флажков, позволяющих мне показывать / скрывать эти столбцы React.Изначально все флажки на этой всплывающей странице установлены в значение true.Когда я снимаю отметку со столбца, этот конкретный столбец отключается.

image

Это код всплывающей страницы для флажка

import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
import { ActionCreators } from '../../../actions';
import ButtonComponent from '../../common/button/ButtonComponent';
import { CheckBox } from '../../common/chkbox/CheckBox';

class CustomizedView extends Component {
  constructor(props) {
    super(props);
    this.handleCheckChildElement = this.handleCheckChildElement.bind(this);
    this.state = {
      items: [
        { id: 1, value: 'Column 1', isChecked: true },
        { id: 2, value: 'Column 2', isChecked: true },
        { id: 3, value: 'Column 3', isChecked: true },
        { id: 4, value: 'Column 4', isChecked: true },
        { id: 5, value: 'Column 5', isChecked: true },
        { id: 6, value: 'Column 6', isChecked: true },
        { id: 7, value: 'Column 7', isChecked: true },
        { id: 8, value: 'Column 8', isChecked: true },
      ]
    };
  }

  handleClick() {
    this.setState({ isChecked: !this.state.isChecked });
  }

  handleCheckChildElement(event) {
    const { items } = this.state; //extract state values like this to a const variable
    const newItems = items.map((item) => { //do map on items because map returns a new array. It’s good practice to use .map than forEach in your case
      if(item.value === event.target.value) {
        item.isChecked = event.target.checked;
        return item; //return updated item object so that it will be pushed to the newItems array
      }
      return item; // return item because you need this item object as well
    });
    this.setState({ items: newItems }); //finally set newItems array into items
    const column1checked = items[0].isChecked;
    console.log('column1checked ' + column1checked);
    const column2checked = items[1].isChecked;
    console.log('column2checked ' + column2checked);
    const column3checked = items[2].isChecked;
    console.log('column3checked ' + column3checked);
    const column4checked = items[3].isChecked;
    console.log('column4checked ' + column4checked);
    const column5checked = items[4].isChecked;
    console.log('column5checked ' + column5checked);
    const column6checked = items[5].isChecked;
    console.log('column6checked ' + column6checked);
    const column7checked = items[6].isChecked;
    console.log('column7checked ' + column7checked);
    const column8checked = items[7].isChecked;
    console.log('column8checked ' + column8checked);
  }

  render() {
    return (
      <div className='div-container-custom' >
        <div className='bottomBar'>
          <ButtonComponent
            text='Apply'
            className='activeButton filterMargin-custom'
            width='100'
            display='inline-block'
            onClick={() => { this.props.applyFilter(this.state, false); }}
          />
          <ButtonComponent
            text='Clear Filter'
            className='greyedButton clear-custom-filter'
            width='100'
            display='block'
            marginTop='60'
            onClick={() => { this.props.applyFilter(this.state, true); }}
          />
        </div>
        <div>
          <div className='data-points-text'>
            <span> Columns </span>
          </div>
          <div className="App">
            <ul>
              {
                this.state.items.map((item, i) => {
                  return (<div key={i} ><CheckBox handleCheckChildElement={this.handleCheckChildElement} {...item} /></div>);
                })
              };
            </ul>
          </div>
        </div>
      </div>
    );
  }
}

CustomizedView.propTypes = {
  applyFilter: PropTypes.func.isRequired
};

CustomizedView.defaultProps = {
};

function mapStateToProps(state) {
  return {
    auth: state.auth
  };
}

function mapDispatchToProps(dispatch) {
  return bindActionCreators(ActionCreators, dispatch);
}

export default connect(mapStateToProps, mapDispatchToProps)(CustomizedView);

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

Можно ли передать константы (true / false) или передать состояние.Я хочу перевести логическое значение для каждого столбца из компонентов \ abcdashboard \ custom_view \ Customizedview в компоненты \ common \act_table \ ReactTableComponent

Пожалуйста, посмотрите внимательно.Обратите внимание на строки после

this.setState({ items: newItems });

Я попытался экспортировать константы, но получил ошибку.Я думаю, что React не позволяет нам экспортировать константы.Если я перенесу состояние, как мне получить состояние из компонентов \ abcdashboard \ custom_view \ Customizedview в компоненты \ common \act_table \ ReactTableComponent

Следует отметить, что эти компоненты не являются Parent - Child.Вы можете проверить пути к файлам.

Будучи новичком, я понятия не имею о Redux.Хотя у меня есть подключение Redux, но я не знаю, как это использовать.Так как я могу получить доступ к состоянию из компонентов \ abcdashboard \ custom_view \ Customizedview в компонентах \ common \act_table \ ReactTableComponent

export default connect(mapStateToProps, mapDispatchToProps)(CustomizedView);

Итак, у меня есть функции mapStateToProps и mapDispatchToProps

function mapStateToProps(state) {
  return {
    auth: state.auth
  };
}

function mapDispatchToProps(dispatch) {
  return bindActionCreators(ActionCreators, dispatch);
}

Я простонеобходимо перенести 8 флагов / логических значений из компонентов \ abcdashboard \ custom_view \ Customizedview в компоненты \ common \ react_table \ ReactTableComponent

1 Ответ

0 голосов
/ 10 декабря 2018

Таким образом, вы можете достичь своего варианта использования двумя способами.Я объясню это с помощью состояния / реквизита и буду избегать Redux по двум причинам:
Во-первых, вы упомянули, что вы новичок в Redux, поэтому не хотите больше сбивать вас с толку. Но что более важно, я хочу показать вам гораздо больше вещей, чемВы думаете, что достижимо без излишеств.Я объясню теорию с помощью фрагментов кода, но реализация останется за вами.

Предположим, у вас есть компонент с именем App.На нем будет размещен ваш Customizedview + ReactTableComponent.

Экспорт const из компонента или даже ваше состояние не соответствует шаблону в реакции.
Вместо этого передайте реквизит Customizedview с именем onCheckBoxChange.

Ваш Customizedview будет вызывать этот реквизит всякий раз, когда флажок будет изменен, и будет возвращать состояние всех флажков на нем.

Компонент App сохранит его в своем собственном состоянии с именем checkedItems и передаст ему два ReactTableComponent в качестве реквизита.Ниже приведен фрагмент кода:

export default class App extends Component {
 state = {
   checkedItems: [
    { id: checkbox1, checked: true},
    { id: checkbox2, checked: true},
    { id: checkbox3, checked: true},
    { id: checkbox4, checked: true},
   ]
 }
 render () {
    return (
     <App>
      <Customizedview
         onCheckboxChange={checkedItems => this.setState({checkedItems})}
      />

      <Customizedview 
        checkedItems={this.state.checkedItems}
      />
     </App>
     );
  }
}

Если у вас есть какие-либо затруднения, пожалуйста, прокомментируйте.

...