Как передать значение ключа из inputText изменения в ReactJs в машинописи? - PullRequest
3 голосов
/ 04 октября 2019

Я использую регистр переключателя для сравнения ключа объекта со строкой в ​​коде ниже:

import { TextField, Button } from "@material-ui/core";
import React, { Component, ReactNode } from "react";

import classes from "./Contact.module.scss";

class contactForm extends Component {
    state = {
        contactForm: {
            name: "",
            email: "",
            message: "",
            phone: ""
        }
    };

    render(): ReactNode {
        return (
            <form className={classes.ArticleBody}>
                <div className={classes.ContactForm}>
                    <TextField
                        value={this.state.contactForm.name}
                        onChange={event => this._inputChangeHandler(event, "name")}
                        label="Full Name"
                        required
                    />
                    <TextField
                        value={this.state.contactForm.email}
                        onChange={event => this._inputChangeHandler(event, "email")}
                        type="Email"
                        label="Email"
                        required
                    />
                    <TextField
                        value={this.state.contactForm.phone}
                        onChange={event => this._inputChangeHandler(event, "phone")}
                        type="phone"
                        label="Phone Number"
                        required
                    />
                    <TextField
                        type="textarea"
                        value={this.state.contactForm.message}
                        label="Comment/Message"
                        rows="4"
                        onChange={event => this._inputChangeHandler(event, "message")}
                        multiline
                        required
                    />
                </div>

                <div className={classes.Submit}>
                    <Button type="submit" onClick={this._submitContactForm}>
                        Submit
                    </Button>
                </div>
            </form>
        );
    }

    private _inputChangeHandler = (event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>, key: string) => {
        const updatedFormData = { ...this.state.contactForm };
        switch (key) {
            case "email":
                updatedFormData.email = event.target.value;
                break;
            case "phone":
                updatedFormData.phone = event.target.value;
                break;
            case "message":
                updatedFormData.message = event.target.value;
                break;
            case "name":
                updatedFormData.name = event.target.value;
                break;
        }
        this.setState({ contactForm: updatedFormData });
    };

    private _submitContactForm = (event: React.MouseEvent<HTMLButtonElement, MouseEvent>): void => {
        event.preventDefault();
        console.log(this.state.contactForm);
    };
}

export default contactForm;

Я не хочу сравнивать ключи объекта с регистром switch. Существует ли какой-либо общий подход для изменения значений при изменении входа для определенного состояния? Например: в приведенном ниже коде я пытаюсь сопоставить ключ из параметра в методе _inputChangeHandler, но он выдает ошибку

Элемент неявно имеет тип 'any', поскольку выражение типа 'string' может'не использовать для индексации типа' {name: string;электронная почта: строка;сообщение: строка;телефон: строка;} '

const updatedFormData = { ...this.state.contactForm };
updatedFormData[key] = event.target.value;
this.setState({ contactForm: updatedFormData });

Спасибо

Ответы [ 3 ]

3 голосов
/ 04 октября 2019

попробуйте вот так

this.setState({ contactForm: {...this.state.contactForm, [key]: event.target.value} });

@ Ajay Verma

вы можете установить атрибут name для TextField, а затем вы можете получить ключ от event.

вот так

...
private _inputChangeHandler = (event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
    const key = event.target.name;
...
<TextField
    value={this.state.contactForm.phone}
    name="phone"
    onChange={this._inputChangeHandler}
    type="phone"
    label="Phone Number"
    required
/>
...
2 голосов
/ 04 октября 2019

TextField имеет имя prop.

Когда вам нужно обработать несколько контролируемых элементов ввода, вы можете добавить атрибут name к каждому элементу и позволить функции-обработчику выбирать, что делать, основываясь на значении event.target.name. React Docs

Например:

<TextField
  name="name"
  value={this.state.contactForm.name}
  onChange={this._inputChangeHandler}
  label="Full Name"
  required
/>

....

public _inputChangeHandler(e) {
  this.setState((prevState) => {
    return {
      contactForm: { 
        ...prevState.contactForm,     
        [e.target.name] : e.target.value
      }
    }
  });
}

1 голос
/ 04 октября 2019

Обычный inputChangeHandler может быть:

private _inputChangeHandler = (
  event: React.ChangeEvent<
    HTMLInputElement | HTMLTextAreaElement
  >,
  key: string
) => {
  this.setState({
    contactForm: {
      ...this.state.contactForm,
      [key]: event.target.value,
    },
  });
};

Ваш оригинальный код будет работать, но вы должны дать набрать подсказку при использовании скобок для доступа к свойству:

const contactForm: {
  [key: string]: string;
} = {
  ...this.state.contactForm,
};
contactForm[key] = event.target.value;

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