钩子允许功能组件在反应中获得基于类的组件中可用的特性,从而使它们更加强大。
useState,我们将从react导入。从'react'导入{useState}; 这有助于我们为功能组件创建局部状态变量,并提供更新该变量的方法。
类中的状态是一个对象,但是如果需要,可以使用useState创建简单的原始数据类型和对象。
const test=()=>{ const [age, setAge] = useState(25); return ( <div> <p>Age: {age}</p> <button onClick={()=>setAge(age+1)}>Increase Age</button> </div> ); }
在上面的示例中,我们创建了一个状态变量age,并使用25进行了初始化。useState还提供了setAge方法,该方法用于单击按钮以将age增加1。
useState为我们提供了一个包含两个元素的数组1.当前值2.更新该值的函数
useState中元素的顺序是固定的,这意味着第一个元素是当前值,第二个是set函数。
同样,我们可以创建多个状态变量,但是这些useState应该是函数主体中的第一条语句。
这是在React 16.8中引入的,并且它向后兼容,这意味着我们可以将类转换为功能组件。
useState仅在该组件的生存期内对其进行一次初始化,并在多个渲染之间保持其值。
我们可以定义一个空数组。
const myList= useState([]);
我们可以传递先前的值并在set函数中对其进行处理
setAge(preAge=>preAge+1);
在更新值时,请确保返回一个新对象以触发重新渲染,否则react假定它是同一对象,并且不会重新渲染,如下 。
onClick={(e)=>{ age.birthYear=e.target.value; setAge(age); }}
它不会触发重新渲染,因为我们只是对当前对象进行了突变,并且对象保持不变。
代替此,我们应该创建新对象。
onClick={(e)=>{ const newAge={birthYear: e.target.value}; setAge(newAge); }}
上面的反应方式看到了新对象的创建,它将在值改变时重新呈现。
这种方法清楚地向我们展示了useState不会合并更新,而是将它们替换为新值。基于类的组件中的setState会自动合并它们。
为了避免丢失对象的其他属性,我们可以使用传播运算符
setAge((prev)=>{ return {…prev, birthYear:newValue}; });
传播运算符将保留对象的其余属性,以防丢失,并更新其他属性。
请注意,所有这些挂钩仅适用于功能组件,而不适用于基于类的组件。这些挂钩在非反应式JavaScript函数中不起作用。
这些钩子不应该在条件语句或循环中使用,而应在函数体的开头在简单语句中声明。
如果您更感兴趣,那么在可以看到钩子实现的地方,分析react库的ReactFiberHooks类中的代码会很有帮助。
不必为局部状态变量提供初始值。更新以异步方式工作,并且不会阻止UI呈现。
可能以这种方式编写新的现代React代码而不是编写类。
我试图在react with typescript中创建一个登录表单。但setEmail方法不接受该值。它表示“string”类型的参数不能分配给“SetStateAction”类型的参数。我该怎么解决它?
我真的很喜欢新的React钩子,我经常在我正在做的项目中使用它们。我遇到了一种情况,我想在hook中使用prevState,但我不确定如何做到这一点。 我尝试过类似的东西,但它无法编译。 (顺便说一句,这是映射一组复选框,以跟踪打了复选标记的复选框) 我试图在这里遵循这个例子,但是不使用setState函数。 谢谢你的帮助!
我正在迁移React with TypeScript项目以使用钩子特性(React v16.7.0-alpha),但我不知道如何设置分解结构元素的类型。 以下是一个例子: 我想强制变量类型为。我唯一成功的试验是分两个阶段进行:打字,然后初始化: 但我相信有更好的办法。另外,应该初始化为一个函数,该函数将作为输入,并且不返回任何内容。 另外,值得注意的是,使用
我第一次面对的问题很小。我试图使用一个简单的useState,但出于某种原因,我不明白为什么React会给我一个错误,不管我想做什么--没有什么能修复它。 这是错误的图像:错误描述: 错误:无效的钩子调用。钩子只能在函数组件的主体内部调用。这可能是由于以下原因之一:1.React和呈现器(例如React DOM)2的版本可能不匹配。你可能违反了钩子3的规则。在同一个应用程序中可能有多个React副
我正在使用钩子,但我得到了这个错误 第25行:React Hook“React.usestate”在函数“contact”中被称为“contact”,它既不是React函数组件也不是自定义React Hook函数React-hooks/rules of-hooks“第26行:React Hook”React.usestate“在函数”contact“中被称为”contact“,它既不是React函