為了順利跟隨教程操作,確保你的開發(fā)環(huán)境已設置好。我們將使用 VS CodeCreate React App 來創(chuàng)建 React 應用。運行以下命令即可創(chuàng)建新的 React 項目:

npx create-react-app state-management

接著,我們需要對項目進行一些清理,刪除不必要的文件(如 SVG 文件、測試文件等),并保留一個空的 div 元素:

import './App.css';

function App() {
  return (
    < div className="app" > 
      {/* 組件將在這里渲染 */}
    < /div > 
  );
}

export default App;

三、創(chuàng)建電影列表組件


我們將創(chuàng)建一個 電影列表組件 來展示電影數(shù)據(jù)。首先,在 src 目錄下創(chuàng)建一個 MovieList.js 文件,并編寫以下代碼:

import React from 'react';

export default function MovieList() {
  const [movies, setMovies] = React.useState([
    { id: 1, name: 'Harry Potter', price: '$10' },
    { id: 2, name: 'Game of Thrones', price: '$10' },
    { id: 3, name: 'Inception', price: '$10' }
  ]);

  return (
    < div > 
      {movies.map(movie = >  (
        < div key={movie.id} > 
           < h3 > {movie.name} < /h3 > 
           < p > {movie.price} < /p > 
         < /div > 
      ))}
     < /div > 
  );
}

然后在 App.js 中導入并使用這個組件:

import MovieList from './MovieList';

function App() {
  return (
     < div className="app" > 
       < MovieList / > 
     < /div > 
  );
}

export default App;

四、創(chuàng)建導航組件


接下來,我們將創(chuàng)建一個導航組件 Nav.js,用于顯示應用的基本信息,包括電影數(shù)量:

import React from 'react';

export default function Nav({ movieCount }) {
  return (
     < div > 
       < h2 > Dev Ed < /h2 > 
       < p > Movie List: {movieCount} < /p > 
     < /div > 
  );
}

App.js 中使用這個導航組件:

import Nav from './Nav';

function App() {
  const [movies, setMovies] = React.useState([
    { id: 1, name: 'Harry Potter', price: '$10' },
    { id: 2, name: 'Game of Thrones', price: '$10' },
    { id: 3, name: 'Inception', price: '$10' }
  ]);

  return (
     < div className="app" > 
       < Nav movieCount={movies.length} / > 
       < MovieList movies={movies} / > 
     < /div > 
  );
}

export default App;

五、狀態(tài)提升

隨著應用的復雜度增加,組件內(nèi)的狀態(tài)管理可能會變得不夠高效。我們可以采用 狀態(tài)提升(State Lifting) 的方法,將狀態(tài)從子組件提升到父組件,然后通過 props 傳遞給子組件。修改后的代碼如下:

App.js 中:

function App() {
  const [movies, setMovies] = React.useState([
    { id: 1, name: 'Harry Potter', price: '$10' },
    { id: 2, name: 'Game of Thrones', price: '$10' },
    { id: 3, name: 'Inception', price: '$10' }
  ]);

  return (
     < div className="app" > 
       < Nav movieCount={movies.length} / > 
       < MovieList movies={movies} / > 
     < /div > 
  );
}

export default App;

MovieList.js 中:

import React from 'react';

export default function MovieList({ movies }) {
  return (
     < div > 
      {movies.map(movie = >  (
         < div key={movie.id} > 
           < h3 > {movie.name} < /h3 > 
           < p > {movie.price} < /p > 
         < /div > 
      ))}
     < /div > 
  );
}

六、Context API 實戰(zhàn)

當組件樹變得更深,通過 props 傳遞狀態(tài) 的方法可能會變得繁瑣。此時,我們可以使用 React Context API 來管理全局狀態(tài),使組件之間共享狀態(tài)更加簡潔高效。

1. 創(chuàng)建 Context

src 目錄下創(chuàng)建一個新的文件 MovieContext.js,并輸入以下代碼:

import React from 'react';

const MovieContext = React.createContext();

export const MovieProvider = ({ children }) = >  {
  const [movies, setMovies] = React.useState([
    { id: 1, name: 'Harry Potter', price: '$10' },
    { id: 2, name: 'Game of Thrones', price: '$10' },
    { id: 3, name: 'Inception', price: '$10' }
  ]);

  return (
     < MovieContext.Provider value={{ movies, setMovies }} > 
      {children}
     < /MovieContext.Provider > 
  );
};

export default MovieContext;

2. 使用 Context

App.js 中,使用 MovieProvider 包裹整個應用:

import { MovieProvider } from './MovieContext';

function App() {
  return (
     < MovieProvider > 
       < div className="app" > 
         < Nav / > 
         < MovieList / > 
         < AddMovie / > 
       < /div > 
     < /MovieProvider > 
  );
}

export default App;

在需要使用狀態(tài)的組件中(如 MovieList.jsNav.jsAddMovie.js),使用 useContext 鉤子來訪問 Context 中的狀態(tài):

import React, { useContext } from 'react';
import MovieContext from './MovieContext';

export default function MovieList() {
  const { movies } = useContext(MovieContext);

  return (
     < div > 
      {movies.map(movie = >  (
         < div key={movie.id} > 
           < h3 > {movie.name} < /h3 > 
           < p > {movie.price} < /p > 
         < /div > 
      ))}
     < /div > 
  );
}

七、添加電影組件

最后,我們創(chuàng)建一個 AddMovie.js 組件,用于添加新的電影到電影列表中:

import React, { useState, useContext } from 'react';
import MovieContext from './MovieContext';

export default function AddMovie() {
  const [name, setName] = useState('');
  const [price, setPrice] = useState('');
  const { movies, setMovies } = useContext(MovieContext);

  const handleSubmit = (e) = >  {
    e.preventDefault();
    setMovies(prevMovies = >  [
      ...prevMovies,
      { id: prevMovies.length + 1, name, price }
    ]);
    setName('');
    setPrice('');
  };

  return (
     < form onSubmit={handleSubmit} > 
       < input
        type="text"
        value={name}
        onChange={(e) = >  setName(e.target.value)}
        placeholder="Movie name"
      / > 
       < input
        type="text"
        value={price}
        onChange={(e) = >  setPrice(e.target.value)}
        placeholder="Price"
      / > 
       < button type="submit" > Add Movie < /button > 
     < /form > 
  );
}

八、總結

通過本文的學習,你掌握了 React 狀態(tài)管理 的基礎知識,并學會了如何使用 React Context API 來進行全局狀態(tài)管理。這種方法簡化了跨多個組件共享狀態(tài)的過程,非常適合中等復雜度的應用。雖然 Context API 在狀態(tài)更新時可能會觸發(fā)組件的重新渲染,但它的簡單性和易用性使其成為許多開發(fā)者的首選方案。

原文引自YouTube視頻:https://www.youtube.com/watch?v=35lXWvCuM8o

上一篇:

介紹:API 與 JavaScript 的基礎

下一篇:

如何輕松創(chuàng)建并部署你的 API:從入門到生產(chǎn)環(huán)境
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數(shù)據(jù)驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費