Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 局部状态可以是可变的吗?_Javascript_Reactjs_React Hooks - Fatal编程技术网

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”,但它似乎毫无价值,并且很容易导致在后续代码中使用错误的变量。