javascript - 如何将 react 钩子(Hook)内的所有状态变量传递给我的子组件

标签 javascript reactjs react-hooks

我正在尝试使用 Hook 获取功能组件中的所有状态。等同于 ...this.state。我避免将状态单独传递给 Context.Provider

因为 this.state 在函数中不可用。 state 未定义。

import React, { useState, useEffect } from 'react'

const RecipeContext = React.createContext()

const RecipeProvider = (props) => {
  const [showHomeButton, setShowHomeButton] = useState(false)
  const [recipes, setRecipes] = useState([])
  const [loading, setLoading] = useState(true)
  const [search, setSearch] = useState('')


  const fetchRecipe = async () => {
    const recipeData = await fetch(`https://api.myjson.com/bins/t7szj`)
    const { recipes } = await recipeData.json()
    setRecipes(recipes)
    setLoading(false)

  }
  const handleSubmit = async (e) => {
    e.preventDefault()
    setLoading(true)
    url = `${url}&q=${search}`
    fetchRecipe(url)
    setShowHomeButton(true)

  }
  const handleSearchChange = (e) => {
    setSearch(e.target.value)
  }
  const handleReturnHome = () => {
    fetchRecipe()
  }
  useEffect(() => {
    fetchRecipe()

  }, [])
  return (
    <RecipeContext.Provider value={}>
      {props.children}
    </RecipeContext.Provider>
  )
}
const RecipeConsumer = RecipeContext.Consumer
export { RecipeProvider, RecipeConsumer }

将组件中的所有状态传递给提供程序中的值的最佳方法是什么。

 <RecipeContext.Provider value={}>
      {props.children}
    </RecipeContext.Provider>

最佳答案

Use an object as the state

const RecipeProvider = (props) => {
  //Declare an object as the state
  const [megaState, setMegaState] = useState({
      showHomeButton: false,
      recipes : [],
      loading : true,
      search: ''
  })



  const fetchRecipe = async () => {
    const recipeData = await fetch(`https://api.myjson.com/bins/t7szj`)
    const { recipes } = await recipeData.json()

    //UPDATE STATE WITHOUT MUTATING
    setMegaState({
        ...megaState
        recipes,
        loading: false
    })    
  }
  const handleSubmit = async (e) => {
    e.preventDefault()
    setLoading(true)
    url = `${url}&q=${search}`
    fetchRecipe(url)
    setShowHomeButton(true)
    //UPDATE STATE WITHOUT MUTATING
    setMegaState({
        ...megaState
        showHomeButton : true 
    })
  }
  const handleSearchChange = (e) => {
    //UPDATE STATE WITHOUT MUTATING
    setMegaState({
        ...megaState
        search : e.target.value 
    })
  }
  const handleReturnHome = () => {
    fetchRecipe()
  }
  useEffect(() => {
    fetchRecipe()

  }, [])
  return (
    <RecipeContext.Provider value={megaState}>
      {props.children}
    </RecipeContext.Provider>
  )
}

这可以通过使用 useReducer 进一步改进! :)

关于javascript - 如何将 react 钩子(Hook)内的所有状态变量传递给我的子组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56875281/

相关文章:

javascript - 列出/输出来自单个输入的逗号分隔值

javascript - 带有 ExtJs 的多选组合框

javascript - highcharts:将 useUTC=true 毫秒转换为 javascript Date 对象

javascript - 在 Formik 中添加 react-bootstrap 警报以处理提交

javascript - 如何访问在另一个 js 文件中的 react Hook 中完成的状态值

javascript - 在执行函数之前等待加载多个 iFrame

javascript - Webpack Bundle 文件没有 CSS 样式和 UI 组件

javascript - 获取动态导入模块失败 :

asp.net-mvc - 我如何将 React Hooks 与 ReactJS.NET 一起使用?

javascript - Linter 提示 React Native Hook 中的依赖项数组为空