Я пытаюсь использовать контекстный API.Я получаю сообщение об ошибке TypeError: «this.props.fetchWeather не является функцией», когда я отправляю форму.
В моем файле WeatherContext есть WeatherProvider и WeatherConsumer.Мое состояние и функция fetchWeather - это этот файл.Когда я регистрирую то, что передается в значение, fetchWeather записывается как неопределенное.
{term: "", forecast: Array(0), fetchWeather: undefined}
Мой вопрос: как мне определить функцию fetchWeather в WeatherContext?Я пытался связать это.Я не уверен, где я иду не так.
Этот вопрос был обновлен, чтобы отразить сделанные мной изменения ...
src / index.js
import React from 'react'
import ReactDOM from 'react-dom'
import App from './App'
import { WeatherProvider, WeatherContext } from
'./context/WeatherContext'
ReactDOM.render(
<WeatherProvider>
<WeatherContext.Consumer>
{({ term, forecast, fetchWeather }) =>
<App term={ term }
forecast={ forecast }
fetchWeather={ fetchWeather } />
}
</WeatherContext.Consumer>
</WeatherProvider>,
document.getElementById('root')
);
registerServiceWorker();
src / app.js
import React, { Component } from 'react'
import SearchForm from './components/Search/Search_Form'
export default class App extends React.Component {
render() {
return (
<div className="App">
<SearchForm {...this.props}/>
</div>
);
}
}
src / context / WeatherContext
import React, { Component } from 'react'
import axios from 'axios'
import _ from 'lodash'
export const WeatherContext = React.createContext();
export class WeatherProvider extends React.Component {
state = {
context: {
input: '',
forecast: [],
fetchWeather: this.fetchWeather
}
}
fetchWeather = (term) => {
let QUERY = term
const KEY = `key`
let URL = `http://url.com/q=${QUERY}&appid=${KEY}`
axios.get(URL)
.then( res => {
// do something ...
})
}
render() {
return (
<WeatherContext.Provider
value={{ ...this.state.context }} >
{ this.props.children }
</WeatherContext.Provider>
)
}
}
src / components / Поиск / индекс
import React from 'react'
import { WeatherContext } from '../../context/WeatherContext'
import SearchForm from './Search_Form'
export default (props) => (
<WeatherContext.Consumer>
{
({fetchWeather}) =>
<SearchForm {...props} fetchWeather={fetchWeather} />
}
</WeatherContext.Consumer>
)
src / components / Поиск / Search_Form
import React, { Component } from 'react'
class SearchForm extends Component {
handleFormSubmit = (e) => {
e.preventDefault();
let term = this.input.value
this.props.fetchWeather(term)
}
handleClear =(e) => {
e.preventDefault();
this.setState({
input: ''
})
}
render() {
console.log(this.props);
return (
<div>
<form className="form" onSubmit={ this.handleFormSubmit }>
<input type='text'
placeholder='Enter a US City'
ref={input => { this.input = input }}/>
<button type="submit"> Search </button>
<button onClick={ this.handleClear }> x </button>
</form>
</div>
)
}
}
export default SearchForm;