#javascript #reactjs #function
#javascript #reactjs #функция
Вопрос:
function useState(initVal){
const state = initVal
const setState = (newVal) => {
state = newVal
}
}
const [state,setState] = useState(0)
console.log(state)
TypeError: useState is not a function or its return value is not iterable
at /home/runner/ViciousSqueakyProfessionals/index.js:8:26
at Script.runInContext (vm.js:130:18)
at Object.<anonymous> (/run_dir/interp.js:209:20)
at Module._compile (internal/modules/cjs/loader.js:1137:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10)
at Module.load (internal/modules/cjs/loader.js:985:32)
at Function.Module._load (internal/modules/cjs/loader.js:878:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
Кажется, я не могу понять, зачем мне нужно, чтобы возвращаемое значение было итеративным, может ли кто-нибудь пролить свет на метод возврата во всех ;-;
Ответ №1:
Поскольку вы вызываете useState
функцию и используете деструкцию массива для возвращаемого значения функции, именно поэтому вам нужно, чтобы вы сначала возвращали массив в самом методе.
Вам необходимо возвращать значения в виде массива, а также изменять состояние на let для переназначения:
function useState(initVal){
let state = initVal
const setState = (newVal) => {
state = newVal
}
return [state, setState];
}
Вы можете использовать это значение любым способом:
const [state, setState] = useState(0);
// or
const value = useState(0);
value[0] // = state
value[1]() // = setState()
Основная причина между этим и фактическим useState
перехватом заключается в том, что изменение state
значения не приведет к повторному использованию компонента.
Комментарии:
1. Но я не могу понять, почему
2. Что подразделение не может понять?
3. Вот почему я должен возвращать значения в виде массива? потому что я использую его как «const [state,setState]=useState(«) « Позже?
4. Yes
useState
— это просто обычная функция5. `функция useState(initVal){ const state = initVal console.log(‘Ran’) const setState = (newVal) => {console.log(‘setState ran’) state = newVal } }` Если я сделаю что-то подобное, как я могу вызвать «setState»
Ответ №2:
Может быть, это похоже на хук react «useState».
Хук «useState» имеет один аргумент и возвращает массив (первый — значение, второй — значение изменения функции).
[Yours]
function useState(initVal){
const state = initVal
const setState = (newVal) => {
state = newVal
}
}
const [state,setState] = useState(0) // error - because you are not return any.
console.log(state)
[Correct]
function useState(initVal){
const state = initVal
const setState = (newVal) => {
state = newVal
}
return [state, setState]
}
const resultOfUseState = useState(0);
console.log(resultOfUseState);
console.log(resultOfUseState[0]);
console.log(resultOfUseState[1]);
Может быть, вы можете понять!
Кроме того, возможно, что «resultOfUseState» имеет значение const [state, setState] = useState . ( resultOfUseState[0] = состояние, resultOfUseState[1] = setState )
Это вызывает деструктурирование.