如何通过反应上下文保持价值?

How to keep a value with react context?

这里有 3 个基本组件 searchBar 指的是 搜索栏表单 显示搜索的 searchPage 组件结果,当然还有 包含所有结果的 app 组件

机制:

  1. 用户在 searchBar 组件中提交输入, handleSubmit 函数被触发,这改变了状态 setSearchedProducts 到输入值,通过 useContext ANDhistory.push() 推送到 ("/SearchPage") .

import {useState, useContext } from "react";
import { useHistory } from "react-router-dom";
import { LocaleContext } from "../../../LocaleContext";



const SearchBar = () => {
    const history = useHistory();
    const {setSearchedTerm} = useContext(LocaleContext);

    
    const handleSubmit = (SearchTerm) => {
        setSearchedProducts(SearchTerm)
        history.push("/SearchPage");
    }
    
    
    return (
      <form>
        <input onSubmit={(e) => handleSubmit(e.target.value)}>
        </input>
        <button type="submit">Submit</button>
      </form>
    )
}

export default SearchBar

  1. 值通过 React 上下文发送到 app 组件 并且 状态被设置为值,同时仍然推送到 ("/searchPage").

import { useState, useMemo } from "react";
import { searchBar, searchPage } from "./components";
import { BrowserRouter as Router, Switch, Route } from "react-router-dom";
import  {LocaleContext} from "./LocaleContext"


const App = () => {

 const [searchedTerm, setSearchedTerm] = useState("");


 const providerValue = useMemo(() => ({searchedTerm, setSearchedTerm}),
 [searchedTerm, setSearchedTerm])



    return (
        <Router>
            <LocaleContext.Provider value={providerValue}>
            
                <searchBar />
                
                <Switch>
                    <Route exact path="/SearchPage">
                        <SearchPage />
                    </Route>
                </Switch>

            </LocaleContext.Provider>
        </Router>

    );
}

export default (App);

  1. 显示 searchPage 组件,它获取状态值 通过使用 useContextuseEffectfetchProducts() 函数被触发,它获取一组 products 状态值。

import {useState, useEffect, useContext}  from 'react';
import { LocaleContext } from "../../LocaleContext";

const SearchPage = ({}) => {

  const [products, setProducts] = useState([]);
  const {searchedTerm} = useContext(LocaleContext);

  const fetchProducts = (term) => {
      setLoading(true);
      const url = new URL(
          "https://example/products"
      );

      let params = {
          "query": term
      };

      Object.keys(params)
          .forEach(key => url.searchParams.append(key, params[key]));

      let headers = {
          "Accept": "application/json",
          "Content-Type": "application/json",
      };

      fetch(url, {
          method: "GET",
          headers: headers,
      })
          .then(response => response.json())
          .then(json => {
              setProducts(json); 
          });

  }



  useEffect(() => {
      fetchProducts(searchedProducts)
  }, [])


  return (
      {
        products.map(product => (
          <div>
            {product.name}
          </div>
        ))
      }
  )
}

export default SearchPage

问题:

import {createContext} from "react";

export const LocaleContext = createContext(null);

如果需要,这是 localeContext 组件。

您必须在 onSubmit 处理程序中添加 e.preventDefault()。否则,您将重新加载页面,这会导致状态丢失。