Javascript 局部状态可以是可变的吗?
有点傻的问题,但通常我知道Javascript 局部状态可以是可变的吗?,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,有点傻的问题,但通常我知道 const [name, setName] = useContext(myContext) 但我有代码,我想做一些事情,比如: var [name, setName] = useContext(myContext) useEffect(() => { if (someCondition) name = undefined setName(name ?? getName()) }, [name]) 我总是看到状态被标记为“const”,但这有
const [name, setName] = useContext(myContext)
但我有代码,我想做一些事情,比如:
var [name, setName] = useContext(myContext)
useEffect(() => {
if (someCondition)
name = undefined
setName(name ?? getName())
}, [name])
我总是看到状态被标记为“const”,但这有关系吗?(可以对上述内容进行重构,使其不再重要,但这个问题特别涉及“var”与“const”是否实际重要)React通常采用函数式编程,在函数式编程中,变量不会被重新分配,状态也不会发生变化。相反,当需要进行更新时,整个函数将使用
useState
(或useContext
)调用返回的更新值重新运行
与此相一致,当使用const
声明变量时,它通常使代码更容易一目了然-它将帮助您记住这不会被重新分配,相反,当发生更新时,整个函数将再次运行
并非完全禁止使用var
,但如果您尝试重新分配变量,则很容易误导您,因为它几乎肯定不会按预期工作-只要渲染处于活动状态,重新分配的变量将只具有被重新分配的“状态”。下一次渲染开始后,useContext
返回的先前(或更新的)name
将成为新的name
,而不管重新分配给哪个name
最佳做法是避免重新分配,以避免潜在的困惑。如果您认为您想要重新分配一个变量,您可能应该重新考虑并考虑更具反应性的处理方式,这可能涉及设置状态
因此,状态变量可能不应该被重新分配——但其他普通(非反应)变量也可以,如果它能帮助您实现所需的逻辑的话。(如
let count=4;
或其他什么,其中count
是嵌套函数的局部函数,不需要是有状态的)React通常是函数式编程,在函数式编程中,变量不会被重新分配,状态也不会发生变化。相反,当需要进行更新时,整个函数将使用useState
(或useContext
)调用返回的更新值重新运行
与此相一致,当使用const
声明变量时,它通常使代码更容易一目了然-它将帮助您记住这不会被重新分配,相反,当发生更新时,整个函数将再次运行
并非完全禁止使用var
,但如果您尝试重新分配变量,则很容易误导您,因为它几乎肯定不会按预期工作-只要渲染处于活动状态,重新分配的变量将只具有被重新分配的“状态”。下一次渲染开始后,useContext
返回的先前(或更新的)name
将成为新的name
,而不管重新分配给哪个name
最佳做法是避免重新分配,以避免潜在的困惑。如果您认为您想要重新分配一个变量,您可能应该重新考虑并考虑更具反应性的处理方式,这可能涉及设置状态
因此,状态变量可能不应该被重新分配——但其他普通(非反应)变量也可以,如果它能帮助您实现所需的逻辑的话。(如
let count=4;
或其他什么,其中count
是嵌套函数的本地函数,不需要有状态)它可以,但不应该。只需使用setName(someCondition?name:getName()即可使用var
或let
,但这不会给您带来任何好处,因为如果您只为变量分配一个新值,react不会重新触发其VM diffing算法。您需要使用setName
来提示重新触发所述diffing算法。编辑可以,但不应该。只需使用setName即可(someCondition?名称:getName()
您“可以”使用var
或let
,但这不会给您带来任何好处,因为如果您只为变量分配一个新值,react不会重新触发其VM diffing算法。您需要使用setName
来提示重新触发所述diffing算法。我认为“使用…”部分中的所有变量通常都不正确d以特定的方式工作,这样在普通JS中修改它们实际上不会修改它们的值,可以肯定的是,someVar=42
不会影响当前执行之外的数据,所以对我来说这很清楚。如果人们混合使用全局和局部状态,我会感到困惑。我可以添加“var localName=name”,但它似乎毫无价值,并且很容易导致在后续代码中使用错误的变量。我认为“使用…”部分中的变量通常被理解为以特定的方式工作,因此在普通JS中修改它们实际上不会修改它们的值,可以肯定的是,someVar=42
不会影响当前执行之外的数据,所以对我来说这很清楚。如果人们混合使用全局和局部状态,我可能会感到困惑。我可以添加“var localName=name”,但它似乎毫无价值,并且很容易导致在后续代码中使用错误的变量。