Не могу получить event.target.value, используя элемент select из Автозаполнения Material-UI с Onchange - PullRequest
0 голосов
/ 04 ноября 2019

*** КОД ОБНОВЛЕН ОТ ПРЕДЛОЖЕНИЙ ****** Я учусь использовать материал-UI. Я не могу найти много примеров сочетания его с обработкой событий. Я использовал автозаполнение и текстовое поле для создания предложенного списка данных, извлеченных из API. Я могу отобразить выбранный список, но, щелкнув один из вариантов, я не могу получить значение, которое щелкнуло для передачи функции-члену класса реагирования. Нужно ли правильно привязывать событие к автозаполнению? Как я должен это сделать. Строка 25 в моем коде записывает цель события на консоль, но она всегда равна 0 (я предполагаю, что это ноль). Как я могу установить значение this.state.data для выбранной опции?

Я попытался добавить autoSelect = {true}

Я также попытался переместить эту строку кода в текстовую область.
onChange = {this.updateState}

import React from "react"
import TextField from '@material-ui/core/TextField';
import Autocomplete from '@material-ui/lab/Autocomplete';

class App extends React.Component {


    constructor(props) {
        super(props);

        this.state = {
            data: null,
            isLoaded: false,
            itemSelected: false,
            inputVal: ''}

            this.updateState = this.updateState.bind(this)

        };

        updateState(e) {
            e.persist()
            const newValue = e.target.value
            this.setState({inputVal: newValue, itemSelected: true});
            console.log(e.target.value);

            // eventually I want to render a DIV with data from the selected value
        }

        /// fetch some data

    componentDidMount() {
        fetch('http://jsonplaceholder.typicode.com/posts')
            .then(response => response.json())
            /* .then(json => console.log(json)) */

            .then(data => this.setState({data, isLoaded: true}));
    }

    render() {

        const {isLoaded, itemSelected} = this.state;




        if (!isLoaded) {
            return <div> loading ...</div>;
        } else if (itemSelected) {
            return <div> item selected </div>
        } else {
            const limo = this.state.data;
            return (
                <div>

                    <Autocomplete
                        freeSolo
                        disableClearable
                        autoSelect={true}
                        id = "limoSelect"
                        onChange={this.updateState}
                        value = {this.state.inputVal}
                        options={limo.map(option => "body: '" + option.body + '\n' + "'      id: " + option.id)}
                        renderInput={params => (

                            <TextField
                                {...params}
                                label="Type In Content"
                                id="limoText"
                                value = ''
                                autoSelect={true}
                                margin="normal"
                                variant="outlined"
                                fullWidth
                                InputProps={{...params.InputProps, type: 'search'}}

                            />


                        )}
                    />
                </div>
            );

        }
    }
}

App.defaultProps = {}

export default App;

консольные журналы ноль. Когда вы нажимаете эту опцию, вызывается updateState, и эта переменная устанавливается this.state.itemSelected = true;Нет сообщений об ошибках. Я надеюсь, что console.log в updateState может быть использован для регистрации выбранного элемента!

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

onChange подпись: функция (событие: объект, значение: любое) => void

Вот пример:

import React from 'react';
import Chip from '@material-ui/core/Chip';
import Autocomplete from '@material-ui/lab/Autocomplete';
import TextField from '@material-ui/core/TextField';

export default class Tags extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      tags: []
    };
    this.onTagsChange = this.onTagsChange.bind(this);
  }

  onTagsChange = (event, values) => {
    this.setState({
      tags: values
    }, () => {
      // This will output an array of objects
      // given by Autocompelte options property.
      console.log(this.state.tags);
    });
  }

  render() {
    return (
      <div style={{ width: 500 }}>
        <Autocomplete
          multiple
          options={top100Films}
          getOptionLabel={option => option.title}
          defaultValue={[top100Films[13]]}
          onChange={this.onTagsChange}
          renderInput={params => (
            <TextField
              {...params}
              variant="standard"
              label="Multiple values"
              placeholder="Favorites"
              margin="normal"
              fullWidth
            />
          )}
        />
      </div>
    );
  }
}

const top100Films = [
  { title: 'The Shawshank Redemption', year: 1994 },
  { title: 'The Godfather', year: 1972 },
  { title: 'The Godfather: Part II', year: 1974 },
  { title: 'The Dark Knight', year: 2008 },
  { title: '12 Angry Men', year: 1957 },
  { title: "Schindler's List", year: 1993 },
  { title: 'Pulp Fiction', year: 1994 },
  { title: 'The Lord of the Rings: The Return of the King', year: 2003 },
  { title: 'The Good, the Bad and the Ugly', year: 1966 },
  { title: 'Fight Club', year: 1999 },
  { title: 'The Lord of the Rings: The Fellowship of the Ring', year: 2001 },
  { title: 'Star Wars: Episode V - The Empire Strikes Back', year: 1980 },
  { title: 'Forrest Gump', year: 1994 },
  { title: 'Inception', year: 2010 },
];
0 голосов
/ 04 ноября 2019

Редактировать : Использование e.target.textContent поможет.
Вот действующее Codesandbox для проверки кода (измененные некоторые части, применение приведенных ниже советов и некоторые другие).


Не изменяйте состояние вручную, как это:
this.state.itemSelected = true

Используйте setState (как вы уже делаете для других элементов состояния):

 updateState(e) {
    this.setState({ inputVal: e.target.value, itemSelected: true });
    console.log(e.target.value);
    // eventually I want to render a DIV with data from the selected value
  }

Также совет, вы можете использовать деструктуризацию массива:

const {isLoaded, itemSelected} = this.state;

Вместо

var isloaded = this.state.isLoaded;
var itemSelected = this.state.itemSelected;
...