Как получить доступ к реквизитам и состоянию реагирования - выберите HOC - PullRequest
0 голосов
/ 30 апреля 2018

Я использую act-select v2.0 , чтобы создать выпадающий список с предопределенными элементами. У меня это связано с запросом Parse, который возвращает параметры с текстовым поиском.

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

Компонент имеет имя RestaurantSelect и выглядит следующим образом (сокращенно):

import React, { Component } from 'react'
import AsyncSelect from 'react-select/lib/Async'

type State = {
  inputValue: string
}

const filterRestaurants = (inputValue: string) => {
  return (
    // ... results from Parse query (this works fine)
  )
}

const promiseOptions = inputValue => (
  new Promise(resolve => {
    resolve(filterRestaurants(inputValue))
  })
)

export default class WithPromises extends Component<*, State> {
  state = { inputValue: '' }

  handleInputChange = (newValue: string) => {
    const inputValue = newValue.replace(/\W/g, '')
    this.setState({ inputValue })
    return inputValue
  }

  render() {
    return (
      <AsyncSelect
        className="select-add-user-restaurant"
        cacheOptions
        defaultOptions
        placeholder="Start typing to select restaurant"
        loadOptions={promiseOptions}
      />
    )
  }
}

Родительский компонент, который вызывает RestaurantSelect, выглядит следующим образом:

import React from 'react'
import RestaurantSelect from './RestaurantSelect'

class AddUserRestaurant extends React.Component {
  constructor() {
    super()

    this.state = {
      name: ''
    }
  }

  addUserRestaurant(event) {
    event.preventDefault()

    // NEED INPUT VALUE HERE!
  }

  render() {
    return (
      <form onSubmit={(e) => this.addUserRestaurant(e)}>

        <RestaurantSelect />

        <button type="submit">Add</button>
      </form>
    )
  }
}

export default AddUserRestaurant

Если я проверяю компонент, я вижу, что атрибут ввода value соответствует набранному тексту, но когда значение выбрано из выпадающего списка, оно исчезает (т. Е. Изменяется от <input value="Typed name" /> до <input value />. Отдельный <span> появляется элемент со значением метки, но я не хочу получать его из DOM, это не похоже на предполагаемый метод.

Если я буду искать на компоненте консоли React мой компонент, RestaurantSelect ничего не будет найдено:

Blank results for component search

Но, если я ищу «Выбрать», он появляется и имеет props и state, которые имеют выбранное значение (в данном случае «Time 4 Thai»):

Component result with props and state

Однако console.log(this.state) в RestaurantSelect показывает только inputValue, ничего из <Select/>

Есть ли способ получить доступ к props и state компонента высшего порядка?

1 Ответ

0 голосов
/ 30 апреля 2018

Обнаружена проблема, в RestaurantSelect необходимо добавить функцию *1003* в качестве onChange реквизита для возвращенного компонента . Вот так:

  <AsyncSelect
    className="select-add-user-restaurant"
    cacheOptions
    defaultOptions
    placeholder="Start typing to select restaurant"
    loadOptions={promiseOptions}
    onChange={this.handleInputChange}
  />

newValue - объект с этой конструкцией:

{
  value: "name",
  label: "Name"
}

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

handleInputChange = (newValue: string) => {
  this.props.setRestaurantSelection(newValue)
  const inputValue = newValue
  this.setState({ inputValue })
  return inputValue
}

Где this.props.setRestaurantSelection происходит от родительского компонента, вот так:

<RestaurantSelect setRestaurantSelection={this.setRestaurantSelection} />

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

constructor() {
  super()

  this.state = {
    restaurantSlug: ''
  }

  this.setRestaurantSelection = this.setRestaurantSelection.bind(this)
}

…

setRestaurantSelection = (value) => {
  this.setState({
    restaurantSlug: value.value
  })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...