【问题标题】:React Hooks - ContextReact Hooks - 上下文
【发布时间】:2020-06-22 17:16:12
【问题描述】:

我正在使用钩子构建应用程序,但我被卡住了。

我不知道为什么,但我的组件没有从我的上下文组件下载状态,或者我的初始状态没有正确更新。下面我插入一些我的应用程序的屏幕截图。

上下文组件

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

export const WeatherDataContext = createContext();

const WeatherDataContextProvider = (props) => {
    const [weather, setWeather] = useState(
        {
            city: null,
            temp: null
        }
    )
    const addWeather = (city, temp) => {
        setWeather({
            city,
            temp
        })
    }
    
    return (
        <WeatherDataContext.Provider value={{weather, addWeather}}>
            {props.children}
        </WeatherDataContext.Provider>
    )
}

export default WeatherDataContextProvider

表单-axios-组件:

import React, {useContext, useState} from 'react';
import { WeatherDataContext } from '../context/WeatherDataContext';
import axios from 'axios'
import {Link} from 'react-router-dom'


const WeatherForm = () => {
    const {addWeather} = useContext(WeatherDataContext);
    const [value, setValue] = useState('')

    const handleChange = (e) => {
        e.preventDefault();
        axios.get(`https://api.openweathermap.org/data/2.5/weather?q=${value}&appid=${KEY}&units=metric`)
            .then(res => {
                
                
               addWeather(res.data.name, res.data.main.temp)
                
            })
      
    }

    return (
        <div class='weather-form'>
            <form onSubmit={handleChange}>
                <input placeholder='City' onChange={(e) => setValue(e.target.value)} value={value} required/>
                <Link to='/weather'><button>Search</button></Link>
                
            </form>
        </div>
    )
}

export default WeatherForm

我想使用更新状态的最后一个组件

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

const WeatherFront = () => {
    const {weather} = useContext(WeatherDataContext)
    
    console.log(weather)
    return (
        <div class='weather-front'>
            <h1>City: {weather.city}, Temperatura: {weather.temp}</h1>
        </div>
    )
}

export default WeatherFront

【问题讨论】:

    标签: reactjs react-hooks react-context


    【解决方案1】:

    问题可能是您没有提交表单。

     <Link to='/weather'><button>Search</button></Link>
    

    只需导航到WeatherFront

    你可以试试

    import { useHistory } from "react-router-dom";
    ...
    const WeatherForm = () => {
        const history = useHistory()
        const {addWeather} = useContext(WeatherDataContext)
        const [value, setValue] = useState('')
    
        const handleChange = (e) => {
            e.preventDefault();
            axios.get(`https://api.openweathermap.org/data/2.5/weather?q=${value}&appid=${KEY}&units=metric`)
                .then(res => {
                   addWeather(res.data.name, res.data.main.temp)
                   history.push('/weather')
                })
          
        }
    
        return (
            <div class='weather-form'>
                <form onSubmit={handleChange}>
                    <input placeholder='City' onChange={(e) => setValue(e.target.value)} value={value} required/>
                    <input type="submit" value="Search" />
                </form>
            </div>
        )
    }
    

    【讨论】:

    • 很遗憾没有:/
    • @Bachi,你可以试试useHistory hook。我更新了答案。
    猜你喜欢
    • 2021-12-15
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    相关资源
    最近更新 更多