Как написать все эти три функции в родительском компоненте вместо записи в дочернем компоненте - ReactJS

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

Как написать все эти три функции в родительском компоненте вместо записи в дочернем компоненте - ReactJS

Теперь я написал несколько функций (3 основные функции) в дочернем компоненте. Для простоты приложения я хочу переместить эти 3 функции в родительский компонент.

Это мой дочерний компонент

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


class CustomizedViewInv extends Component {
  constructor(props) {
    super(props);
    this.handleCheckChildElement = this.handleCheckChildElement.bind(this);
    // this.applyFilter = this.applyFilter.bind(this);
    this.resetFilter = this.resetFilter.bind(this);
    this.state = {
      items: this.props.items,
    };
  }

  getCheckBox(item) {
    return (
      <div>
        <input
          value = {item.id}
          // className='chkProd'
          type='checkbox'
          checked = {item.isChecked}
          //disabled = {d.poId !== null || d.status !== 'Responded'}
          onClick = {(e) => { this.handleCheckChildElement(e); }}
        />
        {item.value}
      </div>);
  }

  handleCheckChildElement(event) {
    const { items } = this.state;
    for (let i = 0; i < items.length; i = i + 1) {
      if (items[i].id === +event.target.value) {
        items[i].isChecked = !items[i].isChecked;
        break;
      }
    }
    this.setState({ items });
  }

  resetFilter() {
    const { items } = this.state;
    for (let i = 0; i < items.length; i = i + 1) {
      items[i].isChecked = true;
    }
    this.setState({ items });
    console.info('Reset filter : > Items : ' + JSON.stringify(items));
  }

  render() {
    const { items } = this.state;
    return (
      <div className='dashboardFilter-container' >
        <div className='bottomBar'>
          <ButtonComponent
            text='Apply'
            className='activeButton filterMargin-div'
            width='100'
            display='inline-block'
            // onClick = {() => { this.props.applyFilter(); }}
          />
          <ButtonComponent
            text='Reset'
            className='greyedButton clear-dashboard-filter'
            width='100'
            display='block'
            marginTop='60'
            onClick = {() => { this.resetFilter(); }}
          />
        </div>
        <div>
          <div className='data-points-text'>
            <span> Columns </span>
          </div>
          <div className = "App">
            {items.map((item) => {
                return this.getCheckBox(item);
            })}
          </div>
        </div>
      </div>
    );
  }
}

CustomizedViewInv.propTypes = {
  items: PropTypes.arrayOf(PropTypes.shape({})).isRequired,
};

CustomizedViewInv.defaultProps = {
};

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

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

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

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

Bascilly в состоянии родительского компонента у меня есть объект с именем filterItems

filterItems: [
        { id: 1, value: 'Col 1', isChecked: true },
        { id: 2, value: 'Col 2', isChecked: true },
        { id: 3, value: 'Col 3', isChecked: true },
        { id: 4, value: 'Col 4', isChecked: true },
        { id: 5, value: 'Col 5', isChecked: true },
        { id: 6, value: 'Col 6', isChecked: true },
        { id: 7, value: 'Col 7', isChecked: true },
        { id: 8, value: 'Col 8', isChecked: true },
        { id: 9, value: 'Col 9', isChecked: true },
        { id: 10, value: 'Col 10', isChecked: true },
      ],
      isCustomizedOpen: false,

Теперь я в основном так зову Ребенка

{this.state.isCustomizedOpen &&
          <CustomizedViewInv
            items = {filterItems}
          />}

Пожалуйста, покажите мне, как переместить эти 3 функции - getCheckBox, handleCheckChildElement и resetFilter с дочерней страницы на родительскую.

Я в основном новичок в React. Поэтому, пожалуйста, помогите мне понять, какие изменения мне нужно изменить, чтобы переместить эти 3 функции - getCheckBox, handleCheckChildElement и resetFilter с дочерней страницы на родительскую.

Есть еще одна проблема с кодом: у вас дублированное состояние, которое может быть непредсказуемым. Вам нужно сохранить состояние в родительском элементе и передать его в props. Тогда продвижение функций будет простым. Настройте рабочий codeandbox.io с вашим кодом, и я могу отредактировать его для вас.

kev 15.12.2018 16:45
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
53
1

Ответы 1

попробуйте этот подход; позвольте вашему контейнеру иметь больший контроль над компонентами рабочий пример

const CheckBox = props => {
  return (
    <div>
      <input
        value = {props.item.id}
        type = "checkbox"
        checked = {props.item.isChecked}
        onClick = {props.handleCheckChildElement}
      />
      {props.item.value}
    </div>
  );
};

const Button = props => {
  return <button onClick = {() => props.onClick()}>{props.text}</button>;
};

export default class App extends React.Component {
  state = {
    filterItems: [
      { id: 1, value: "Col 1", isChecked: true },
      { id: 2, value: "Col 2", isChecked: true },
      { id: 3, value: "Col 3", isChecked: true },
      { id: 4, value: "Col 4", isChecked: true },
      { id: 5, value: "Col 5", isChecked: true },
      { id: 6, value: "Col 6", isChecked: true },
      { id: 7, value: "Col 7", isChecked: true },
      { id: 8, value: "Col 8", isChecked: true },
      { id: 9, value: "Col 9", isChecked: true },
      { id: 10, value: "Col 10", isChecked: true }
    ]
  };
  handleCheckChildElement(e) {
    alert(e.target.value);
  }
  resetFilter() {
    alert("resetFilter");
  }
  applyFilter() {
    alert("applyFilter");
  }
  render = () => {
    return (
      <div>
        {this.state.filterItems.map(item => (
          <CheckBox
            item = {item}
            handleCheckChildElement = {this.handleCheckChildElement.bind(this)}
          />
        ))}
        <Button text = "Reset" onClick = {this.resetFilter.bind(this)} />
        <Button text = "Apply" onClick = {this.applyFilter.bind(this)} />
      </div>
    );
  };
}

Я должен решить эту проблему по своей методике. Можете ли вы помочь мне перенести эти 3 функции из вышеупомянутого дочернего компонента в компонент?

tommy123 15.12.2018 17:51

getCheckBox усложняет задачу, не уверен, что вы хотите это сделать codeandbox.io/s/0yzv46l9l0

Mustafa Kahraman 16.12.2018 00:35

Другие вопросы по теме