React 何时使用全局变量而不是状态

Abr*_*ham 3 reactjs react-component

我将从 API 加载的数据放入在函数组件外部声明的变量中。我曾想过将其置于某种状态,因为它需要通过多次渲染来保持。但我没有看到目的,因为我的代码中没有任何内容对数据的更改做出反应。

如果我继续使用这种方法在整个渲染过程中记住被动数据,这会是一种反模式吗?

var cityList;
function Component(){
    
    useEffects(async ()=>{
        if (!cityList)}{
            cityList = await loadCities();
        }
    });
    
    ...
}
Run Code Online (Sandbox Code Playgroud)

另外我知道我可以使用像useMemo(). 但我想知道这是否有问题。

最重要的是,使用这样的变量而不是 State 或 memo 的可能原因是什么

Som*_*ial 5

之所以使用state而不是组件外部的变量是因为重新渲染

如果您不使用状态,组件将不会使用从 api 返回的新数据进行更新。

另外,如果你只想更新一次数据,正确的useEffect使用方法如下(已注释)。

const [ cityList, setCityList ] = useState([]);

function Component(){
    
    useEffects(()=>{      //<-- remove async here as it's not allowed.
        
        const getData = async () => {
              
              const data = await loadCities();
              setCityList(data)

        }
        getData();
    },[]);  //<---- add a empty dependency so it only called once when component mounts
    
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果它不改变,我们通常使用外部组件变量。

const initialData = ['a','b','c']

component A = () => {
      // it's fine to use initialData out of the component because it doesn't change.
}
Run Code Online (Sandbox Code Playgroud)

当然,有时我们也可以在组件外部使用可以随时间变化的变量。但前提是组件的渲染不依赖于它。(例如使用全局变量来跟踪 setTimeout)

  • 由于脚本是一个模块,变量范围是否仅限于组件脚本? (3认同)
  • 我猜想,如果您将所有组件捆绑编译到一个 JS 中,您只会看到该错误。 (3认同)