Ищете более элегантный способ написать несколько компонентов, используя похожие функции

У меня есть этот компонент, который отображает данные, но также должен сохранять и управлять состоянием. У меня есть 5 других компонентов, которые точно такие же, за исключением небольших нюансов внутри их функций. Мне нужна помощь в поиске более элегантного способа написать этот код, а не иметь 6 более или менее одинаковых файлов.

Я попытался понять и использовать HOC для этого экземпляра, но каждый компонент имеет свой собственный вызов отправки, который требует данных, специфичных для этого компонента. Итак, я не могу найти способ заставить работать HOC.

Это мои функции:

  componentDidMount () {
    setTimeout(() => {
      this.setState({ baseForm: this.props.baseData })
      this.getDisable()
      this.setState({ loading: false })
    }, 2000)
  }

  handleSwitch = item => event => {
    this.setState({ [item]: event.target.checked })
  }

  handlePRESubmit () {
    const array = this.state.baseForm
    array.forEach(item => {
      item.isTemplate = false
      item.mark = this.state.mark
      item.isVisible = this.state.visible
      item.genesisId = item._id
    })
  }

  handleSubmit = () => {
    this.handlePRESubmit()
    let formData = this.state.baseForm[0]
    fetch(APIURL, {
      method: 'POST',
      body: JSON.stringify(formData),
    }).then(response => {
      response.json().then(data => {
        let orgId = localStorage.getItem('orgId')
        let sku = { skuId: data.data._id, type: 'verification' }
        fetch(APIURL, {})
          .then(response => response.json())
          .then(data => {})
      })
    })
  }

  toggleDisabled () {
    if (this.state.assigned !== undefined) {
      this.setState({ disabled: !this.state.disabled })
    }
  }

  getDisable () {
    setTimeout(() => {
      const result = this.props.assignedSku.find(e => e.name === 'Base')
      this.setState({ assigned: result })
      if (this.state.assigned !== undefined) {
        this.setState({ mark: true })
        this.setState({ visible: true })
      }
    }, 1000)
  }

  handleMenu = event => {
    this.setState({ anchorEl: event.currentTarget })
  }

  handleClose = () => {
    this.setState({ anchorEl: null })
  }

А это моя карта

        <Card id='partner-sku-card'>
          <CardHeader
            title = {base.name}
            subheader = {'$' + ' ' + base.price}
            action = {
              <div>
                <IconButton onClick = {this.handleMenu}/>
              </div>
            }
          />
          <Menu
            anchorEl = {anchorEl}
            open = {Boolean(anchorEl)}
            onClose = {this.handleClose}
          >
            <MenuItem disabled = {this.state.disabled ? 'disabled' : ''}>
              Edit
            </MenuItem>
          </Menu>
          <CardActions>
            <FormControlLabel
              control = {
                <Switch
                  checked = {this.state.mark}
                  onChange = {this.handleSwitch('mark')}
                  value='mark'
                />
              }
            />
            <FormControlLabel
              control = {
                <Switch
                  checked = {this.state.visible}
                  onChange = {this.handleSwitch('visible')}
                  value='visible'
                />
              }
            />
            <Button onClick = {this.handleSubmit}>
              Submit
            </Button>
          </CardActions>
        </Card>

Опять же, весь этот код снова пишется в 5 других файлах. Мне нужен элегантный способ заменить слово «база» / «база» во всех аспектах этого. Допустим, у меня есть Base, Mid, Top. Мне нужно, чтобы все эти функции работали для всех 3 и по-прежнему производили одну и ту же карту в конце. Спасибо за помощь!

Поведение ключевого слова "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) для оценки ваших знаний,...
2
0
37
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Создайте компонент под названием CardWrapper или что-то в этом роде. Затем в каждом другом файле вызовите CardWrapper следующим образом:

class First extends Component {
    handleSwitch = () => {
        //its own implementation
    }

    handlePreSubmit = () => {
        //its own implementation
    }

    handleSubmit = () => {
        //its own implementation
    }
    //other methods that you need for each component to be different

    render(){
        return (
            <CardWrapper handlePreSubmit = {this.handlePreSubmit} handleSubmit = {this.handleSubmit} handleSwitch = {this.handleSwitch} />
        )
    }
}

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

А затем в CardWrapper вы можете получить к нему доступ с помощью this.props. Бывший. в конце концов, когда у вас есть Submit Button, это изменится так:

<Button onClick = {this.props.handleSubmit}>
    Submit
</Button>

да ладно, чтобы у каждого компонента была своя логика, но тогда использовать CardWrapper как «шаблон» для визуальной карты?

Philip Kappaz 10.04.2019 21:08

@PhilipKappaz да. Вы можете поделиться внутри CardWrapper сколько угодно вещами, но те методы, которые должны быть разными для каждого компонента, должны быть в своих компонентах.

Ertan Hasani 10.04.2019 21:13

А как насчет изменения состояния? Например, <Switch/> в CardWrapper вызывает {this.state.disabled ? 'diabled' : ''} это просто изменится на this.props.disabled?

Philip Kappaz 10.04.2019 21:55

@PhilipKappaz нет, вам не нужно передавать его через реквизиты, поскольку вы уже находитесь в CardWrapper, вы просто получаете к нему доступ как есть this.state.disabled.

Ertan Hasani 11.04.2019 10:01

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