React Hooks. Должен ли я использовать «useState» для неизменного состояния?

Когда я впервые изучал React Component, мне всегда говорили ставить все в this.state. Будь то часть данных, которые часто обновляются, или те, которые никогда не обновляются вообще.

Однако с реализацией хуков React я не уверен, как часто мне следует использовать useState, даже если состояние не будет обновляться.

Позвольте мне привести вам пример моей логики формы:

const FormAuth = props => {
    //Frequently updates
    const [validInput, setValidInput] = useState({
        isCompletedForm: Boolean,
        firstName: Boolean,
        lastName: Boolean,
        email: Boolean,
        password: Boolean,
        confirmPassword: Boolean
    });

    // Never updates
    const [formSchema, setFormSchema] = useState({
        firstName: Joi.string().required(),
        lastName: Joi.string().required(),
        email: Joi.string().required().email().regex(emailRegex),
        password: Joi.string().required().regex(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[#$^+=!*()@%&?.]).{8,30}$/),
        confirmPassword: Joi.string().required()
    })

    // Never updates
    const [inputRef, setInputRef] = useState({
        firstNameRef: React.createRef(),
        lastNameRef: React.createRef(),
        emailRef: React.createRef(),
        passwordRef: React.createRef(),
        confirmPasswordRef: React.createRef()
    });

    // render some JSX
}

Здесь у меня есть 3 состояния. Первое состояние — это булевы значения, которые сообщают, хорошо ли выглядят входные данные. Второе состояние — это formSchema, которая никогда не будет обновляться. Наконец, третье состояние — это Refs для каждого из входов, которые также никогда не будут обновляться.

Мой вопрос: Было бы более разумно использовать иметь только одно состояние для validInputs, поскольку он часто обновляется, а затем для formSchema и inputRef создать константный объект с ванильным javascript? Или все должно прийти в состояние, как раньше?

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

Я думаю, вам следует использовать хуки useRef вместо createRef

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

Ответы 2

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

Вам нужно использовать состояние только в том случае, если:

  • он управляет своего рода элемент (например, input, select, textarea и так далее).
  • он контролирует некоторые виды данных, которыми необходимо манипулировать (например, список задач, в котором должны быть некоторые элементы, которые создаются, читаются, обновляются и удаляются — это справедливо и для изоморфных приложений, где некоторые данные необходимо манипулировать на перед отправкой на серверную часть для хранения).
  • он используется для своего рода условный рендеринг, где DOM необходимо повторно отображать с изменениями пользовательского интерфейса (например, логическое значение isLoading, которое показывает счетчик, когда true, но затем отображает какой-то макет, когда false).

Нет причин загромождать ваше состояние, если оно (независимо от тип данных): его необходимо повторно использовать в нескольких компонентах, оно статично и никоим образом не обновляет DOM (например, ref или функция проверки на уровне поля или какой-то статический список предметов).

Проще говоря, не имеет значения, является ли это компонентом класса или функциональным компонентом с хуком, вам нужно будет использовать состояние только в том случае, если оно требует динамического управления/управления чем-либо в DOM.

Вот простой пример формы с некоторой проверкой:

Edit Form Validation

я боюсь, что ваше часто обновляемое состояние находится в объекте. да, вы можете это сделать, но это не лучший способ обновить ваше индивидуальное состояние, поместив их в объект.

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

//you can track your state value and state change by this function
//you can use this same function in different component
export function useFormInput(initialValue = "") {
    const [input, setInput] = useState(initialValue);
    function handleInputChange(e) {
        setInput(e.target.value);
    }

    return {
        value: input,
        onChange: handleInputChange,
    }
}


const FormAuth = props => {
  //Frequently updates
  //useFormInput function will return input value and unchange function
  const firstName = useFormInput();
  const lastName = useFormInput();

  // Never updates
  //here your not updating data is assigned in formSchema variable
  const formSchema = {
    firstName: Joi.string().required(),
    lastName: Joi.string().required(),
    email: Joi.string().required().email().regex(emailRegex),
    password: Joi.string().required().regex(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[#$^+=!*()@%&?.]).{8,30}$/),
    confirmPassword: Joi.string().required()
  }

  // Never updates
  const inputRef = {
    firstNameRef: React.createRef(),
    lastNameRef: React.createRef(),
    emailRef: React.createRef(),
    passwordRef: React.createRef(),
    confirmPasswordRef: React.createRef()
  }

  return(
    <div>
      //firstname value and onchange function will be
      //assigned useing spread operator
      <input {...firstName} placeholder = "first name"/>
      <input {...lastName} placeholder = "last name"/>
    </div>
  )
}

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