Установка defultValue компонента TextField пользовательского интерфейса материала в React

Я разрабатываю приложение React JS. Что я сейчас делаю, так это асинхронно получаю данные с сервера и визуализирую значения в TextField. Я знаю, как это делать, и мой подход тоже работает. Но мне просто не нравится мой нынешний подход.

Это рабочий подход

class TestComponent extends React.Component {

    constructor(props)
    {
        super(props);
        this.fetchName = this.fetchName.bind(this);
        this.handleChangeEvent = this.handleChangeEvent.bind(this);
        this.state = {
            name : ''
        }
    }


    fetchName()
    {
        //get the name asynchronously from the server. I am using Axios
        this.setState({ name : nameValueFromTheServer })
    }


    handleChangeEvent(e)
    {
        this.setState({ name : e.target.value })
    }

    render()
    {
        return (
            <MuiThemeProvider>
            <div>
                <TextField onChange = {this.handleChangeEvent} label = "Name" value = {this.state.name} />
            </div>
            </MuiThemeProvider>
        )
    }
}

Что мне не нравится в вышеупомянутом подходе, так это то, что мне нужно реализовать метод handleChangeEvent для получения значения входного значения. Если я его не реализую, я не могу изменить входное значение имени, потому что значение состояния не изменилось. Чтобы получить простое входное значение, мне нужно написать дополнительные строки кода. В jQuery я просто получаю такое входное значение, $ (selector) .val (). Без реализации метода handleChangeEvent я могу использовать ссылку вот так.

<TextField inputRedf = {(input) => this.tfName = input } label = "Name" />

Затем я получаю значение динамически следующим образом.

this.tfName.value

Проблема с использованием ссылки заключается в установке значения по умолчанию, которое асинхронно загружается с сервера.

Я могу установить такое значение по умолчанию для TextField

<TextField inputRedf = {(input) => this.tfName = input } defaultValue = {this.state.name} label = "Name" />

Обратите внимание на атрибут defaultValue в приведенном выше коде. Когда я устанавливаю значение с помощью defaultValue, начальное значение состояния имени будет установлено в текстовое поле. Но мы все равно можем изменить входное значение имени, вводимого из пользовательского интерфейса, даже если мы не реализуем событие handleChangeEvent. Но проблема в том, что я получаю данные асинхронно и динамически устанавливаю this.state.name.

Итак, в конструкторе компонента состояние имени пусто. Затем я установил его в обратном вызове асинхронного вызова. Но значение defaultValue можно установить только один раз. Таким образом, поле ввода всегда отображается пустым. Я хотел бы знать, как я могу динамически установить значение по умолчанию для TextField? Причина, по которой я использую ref, заключается в том, что я не хочу реализовывать событие onChange, а также отслеживать состояние сброса входного значения. Если бы я мог установить значение defaultValue динамически, я бы просто динамически использовал значение в обратном вызове асинхронного вызова. Как лучше всего упростить этот сценарий?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
3
0
8 900
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

На самом деле вам не нужно значение по умолчанию. Если вы хотите избежать использования обработчика onChange, вы можете обязательно установить входное значение в асинхронном обратном вызове:

class TestComponent extends React.Component {
    constructor(props) {
        super(props);
        this.fetchName = this.fetchName.bind(this);
        this.handleChangeEvent = this.handleChangeEvent.bind(this);
    }

    fetchName() {
        if (this.tfName.value == '') {
            // only update if user have not changed the input value. 
            this.tfName.value = nameValueFromTheServer; 
        }
    }
    render() {
        return (
            <MuiThemeProvider>
                <div>
                    <TextField 
                        inputRef = {(input) => this.tfName = input }
                        label = "Name"/>
                </div>
            </MuiThemeProvider>
        );
    }
}

Огромное спасибо. OMG, я слишком много думал.

Wai Yan Hein 31.07.2018 21:11

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