как написать многострочное состояние с помощью хуков useState в ReactJs - PullRequest
2 голосов
/ 26 мая 2020

React 16.9

Я знаю, что это class component state:

class JustAnotherCounter extends Component {
  state = {
    count: 0
  };

эквивалентно использованию хуков useState:

function JustAnotherCounter() {
  const [count, setCount] = useState(0);

.. но что было бы эквивалентом состояния компонента класса ниже, используя Hooks useState?:

class Main extends Component {
    state = {
        step: 1,
        firstName: '',
        lastName: '',
        jobTitle: '',
        jobCompany: '',
        jobLocation: '',
    }

Любая помощь буду очень признателен.

Ответы [ 4 ]

2 голосов
/ 26 мая 2020

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

   const [state, setState] = useState({
        step: 1,
        firstName: '',
        lastName: '',
        jobTitle: '',
        jobCompany: '',
        jobLocation: '',
    });
   // Setting state like:
   setState(prev=>{...prev,firstName:'Joey'});

Вы также можете настроить множественные вызовы состояния

const [step,setStep] = useState(1);
const [firstName,setFirstName] = useState('');
const [lastName,setLastName] = useState('');
const [jobTitle,setJobTitle] = useState('');
const [jobCompany,setJobCompany] = useState('');
const [jobLocation,setJobLocation] = useState('');

Другой вариант - использовать редуктор, который можно превратить в гораздо более сложный пример, чем этот:

const [state, dispatch] = useReducer(
  (state, action) => ({ ...state, [action.name]: action.value }),
  {
    step: 1,
    firstName: '',
    lastName: '',
    jobTitle: '',
    jobCompany: '',
    jobLocation: '',
  }
);
// Then update values using:
dispatch({ name: 'firstName', value: 'Joey' });

2 голосов
/ 26 мая 2020

Вы можете использоватьState для инициализации таких объектов:

function Main() {
  const [form, setValues] = useState({
      step: 1,
      firstName: '',
      lastName: '',
      jobTitle: '',
      jobCompany: '',
      jobLocation: '',
  })
}

А затем для установки значений вы можете сделать что-то вроде

setValues({
    ...form,
    firstName: 'Andrew',
})
1 голос
/ 26 мая 2020

Вы можете сохранить свое значение состояния как объект.

Помните, когда вы обновляете значение вашего объекта с помощью setState, вы ДОЛЖНЫ создать новый объект вместо обновления существующего значения объекта, потому что setState сравнивает ссылочное значение объекта, а не значение объекта. Это отличается от использования компонента React Class.

ссылка: https://reactjs.org/docs/hooks-faq.html#should -i-use-one-or-many-state-variables

сохраните свое состояние как объект

const [state, setState] = useState({ left: 0, top: 0, width: 100, height: 100 });
...
// deep clone your object (use other package like lodash or ramda for better performance)
const newObj = JSON.parse(JSON.stringify(state))
// update value and set state
newObj.top = 28
setState(state);

или с использованием расширения для одной строки setState

// Spreading "...state" ensures we don't "lose" width and height
setState(state => ({ ...state, left: e.pageX, top: e.pageY }));
1 голос
/ 26 мая 2020

Выполнить {npm install response-multi-state} Посмотрите, насколько просто использовать

import { Fragment } from 'react'
function Counter() {
  const [state, setState, { setCount }] = useMultiState({
    count: 0,
    secondCount: 10,
  })

  return (
    <Fragment>
      <button onClick={() => setCount(c => c + 1)}>Update count</button>

      <button
        onClick={() => {
          setState(prevState => ({
            secondCount: prevState.secondCount + 10,
            // use as many `prevState` property values as you wish
          }))
        }}
      >
        Update second count
      </button>
    </Fragment>
  )
}

Вы можете легко обновлять состояния по отдельности

https://github.com/whizkydee/react-multi-state/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...