【问题标题】:Can't render {this.state.city}无法渲染 {this.state.city}
【发布时间】:2019-03-25 02:12:24
【问题描述】:

我正在使用 OpenWeatherMap API 在 React 中创建一个天气应用程序。有输入表单和一个按钮,当我单击按钮时,我希望看到城市名称。当我这样做时,我从 API 收到了数据,但无法在屏幕上呈现它,而我可以在控制台中记录它。

为此,我使用了三个单独的文件。 App.js、Form.js 用于提交条款,weather.js 用于 API 配置。

我猜我需要映射接收到的数据但还没有成功。

class App extends React.Component {
    state = {
        city: null,
    }

    getWeather = async city => {
        const response = await weather.get('/forecast', {
            params: {
                q: city
            }
        });

        this.setState({
            city: response.name,
        })
        console.log(city); <--- This works
    }

    render() {
        return (
            <div> 
                <Form loadWeather={this.getWeather} />            
                <p>{this.state.city}</p> <--- This doesn't work                    
            </div>
        );        
    }
}
class Form extends React.Component {
    state = { term: '' };

    onFormSubmit = (event) => {
        event.preventDefault();

        this.props.loadWeather(this.state.term);
        this.refs.textInput.value = '';
    }

    render() {
        return (
            <div>
                <form onSubmit={this.onFormSubmit}>
                    <input 
                    ref="textInput"
                    type="text" 
                    value={this.state.term} 
                    onChange={event => this.setState({term: event.target.value})}
                     />
                    <button>Get Weather</button>
                </form>
            </div>
        );
    }
}
export default Form;

我打算将 {this.state.name} 作为 prop 传递给子组件,但到目前为止,接收到的数据甚至不会出现在该组件上。

【问题讨论】:

  • 从哪里调用 getWeather 方法?
  • 我做了一个单独的js文件。我将 API 密钥和基本 URL 放入其中,它们工作正常。
  • 所以你是从一个单独的文件中调用函数?我不太明白你在说什么。
  • 是的,我正在从一个单独的文件中调用“getWeather”函数,以便以后我想制作另一个 API 应用程序时可以重用它。我把import weather from '../apis/weather';放在App.js的最上面
  • 您是否将getWeather 传递给App 的某个子组件并从那里调用它?

标签: reactjs api axios


【解决方案1】:

“this.setState”是一个函数,应该这样调用。

this.setState({
    city: response.name,
})

【讨论】:

    【解决方案2】:

    您将状态的 city 设置为 response.name。您将问题标记为 axios,所以我假设您将 axios 用于 ajax。如果是这样,您将希望从response.data.name 的响应中获取数据,而不是response.name

    【讨论】:

    • 非常感谢,我修复了city: response.data.city.name,,终于成功了!!这是我的第一个 API 应用程序,我不知道如何挖掘响应对象。欣赏不够!
    【解决方案3】:

    如果您想从初始渲染中获取城市详细信息,请尝试在 componentDidMount() 生命周期中调用/调用 getWeather() 方法。您使用setState() 的方式也是错误的。它应该是这样的,如下所述。即使您使用单独的文件来调用方法,也可以使用相同的生命周期来获取数据

    class App extends React.Component {
        state = {
            city: null
        };
    
        componentDidMount() {
            this.getWeather("city");
        }
    
        getWeather = async city => {
            const response = await weather.get("/forecast", {
                params: {
                    q: city
                }
            });
    
            this.setState({
                city: response.name
            });
        };
    
        render() {
            return (
                <div>
                    <p>{this.state.city}</p>
                </div>
            );
        }
    }
    

    【讨论】:

    • 非常感谢,但我想我遗漏了一些细节。我尝试了上面的代码,但无法得到预期的结果。可能是其他组件有问题。我现在想做的是,当我输入一个值并单击一个按钮时,我想呈现一个城市名称。我修复了我的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 2013-01-24
    • 2016-01-05
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多