【问题标题】:Managing state with the Context API使用 Context API 管理状态
【发布时间】:2020-08-14 08:55:50
【问题描述】:

我正在重构一些代码,因为我不得不做的道具钻探的数量是无法管理的,所以我借此机会了解了 Context API,但我只是不明白为什么没有状态表现得像我预期的那样......这是我的上下文文件:

import React,{useState, createContext} from 'react';

export const MileContext = createContext();

export const MileProvider = props => {
    const [totalMiles, setTotalMiles] = useState(0);
    const [drivers, setDrivers] = useState(1);

    return (
        <MileContext.Provider 
        value = {
            [totalMiles, setTotalMiles], 
            [drivers, setDrivers]
            }>
            {props.children}    
        </MileContext.Provider>
    )
}

当我从另一个组件更改 totalMiles,然后从另一个组件更改驱动程序时,很明显它们共享一个值...这是另外两个组件。

import React, {useState, useContext} from 'react';
import "./main.css";
import { MileContext } from './MileContext';


const TotalDrivers = () => {
    const [drivers, setDrivers] = useContext(MileContext);
    const onDriverChange = (event) => {
        setDrivers(event.target.value)    
      };

    return(

        <div>
            <p>Total Drivers</p>
            <label>
            <select value={drivers} onChange={onDriverChange}>
                <option value="1">1</option>
                <option value="2">2</option>
            </select>
            </label>
        </div>
    )
}

export default TotalDrivers;

import React, {useState, useContext} from 'react';
import "./main.css";
import {PRESETS} from "./presets";
import { MileContext } from './MileContext';


const PresetSelector = () => {
    const [totalMiles, setTotalMiles] = useContext(MileContext);
    const onTotalMileChange = (event) => {
        setTotalMiles(event.target.value)    
      };

    return(

            <div>
                <label>
                    <h3>Select a preset for your trip (these are round trips from the warehouse and back)</h3>
                    <select onChange={onTotalMileChange}>
                        <option value="0">Custom Trip</option>
                        {
                        Object.entries(PRESETS).map(([campus, mileage]) => (
                        <option key={campus} value={mileage}>
                            {campus}
                        </option>
                        ))} 
                    </select>
                </label>
                trip total miles = {totalMiles}
            </div>

    )
}

export default PresetSelector;

我觉得我快要解决这个问题了,但是我所有的谷歌搜索都失败了。当然,我只是误解了某些东西或没有使用正确的语法。你能帮我理解如何解决这个问题吗?我有很多其他组件和状态值要添加到这个应用程序中。哦,我将它们包装在 app.js 中,如下所示:

  return (
    <MileProvider>

      <Header />
      <form>
      <PresetSelector />
      <TotalDrivers />
      </form>
    </MileProvider>
  );
}

【问题讨论】:

  • 你说“他们共享一个价值观”是什么意思
  • 当我使用 PresetSelector 中的选择从列表中选择某些内容时,它会显示 {totalMiles},但是当我将驱动程序更改为 1 或 2 时,它也会更改 {totalMiles}。当我在反应扩展中拉起状态时,我看不到 totalMiles 和司机,我只看到“价值”

标签: reactjs context-api


【解决方案1】:

您在对象内部传递元组而没有任何键,这是一种无效的语法。

将值传递给上下文提供者时,只需将值作为对象提供。

<MileContext.Provider 
        value = {{
            totalMiles, 
            setTotalMiles, 
            drivers, 
            setDrivers
            }}>
            {props.children}    
        </MileContext.Provider>

在 TotalDrivers 组件中的使用:

const {drivers, setDrivers} = useContext(MileContext);

在 PresetSelector 组件中的使用

const {totalMiles, setTotalMiles} = useContext(MileContext);

【讨论】:

  • 您还应该考虑将setter函数包装在useCallback中,它将处理重新渲染的情况
猜你喜欢
  • 2020-03-29
  • 2020-07-04
  • 2019-09-03
  • 1970-01-01
  • 2019-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多