- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
根据天气情况,应该显示某种类型的图标。
在我的Weather
组件中,我创建了一个包含所有相关图标的对象。我这样做了,而不是将其添加到 state
中,因为根据 React:
Can you compute it based on any other state or props in your component? If so, it isn’t state.
图标可以根据this.currentWeather.main
的值计算出来。
第一次运行时一切正常,但如果您更改城市(更改为具有不同天气类型的城市),图标将保持不变。我不明白为什么。 (即,尝试使用美国塔斯廷 ---> 美国罗切斯特)
我尝试了 console.log(currentIcon)
,并且获得了一个符号对象,并且在其中它具有正确的属性值,但无法正确显示。
我的理解是,当状态更新时(通过您第二次进入另一个城市和国家/地区),Weather
组件应该重新渲染,并且 return
语句应该重新运行,我相信它确实做到了。
只是不确定为什么 return
语句中的 {currentIcon}
没有反射(reflect)该更改。
我很想知道答案,但更重要的是,我很想知道为什么显示没有更新。
const root = document.querySelector('.root');
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
unit: '',
currentWeather: {
main: '',
desc: '',
temp: '',
}
}
this.getWeather = this.getWeather.bind(this);
this.unitHandler = this.unitHandler.bind(this);
}
getWeather(e) {
e.preventDefault();
const city = e.target.elements.city.value;
const country = e.target.elements.country.value;
const appID = 'bf6cdb2b4f3c1293c29610bd1d54512b';
const currentWeatherURL = `https://api.openweathermap.org/data/2.5/weather?q=${city},${country}&units=imperial&APPID=${appID}`;
const forecastURL = `https://api.openweathermap.org/data/2.5/forecast?q=${city},${country}&units=imperial&APPID=${appID}`;
//fetch CURRENT weather data ONLY
fetch(currentWeatherURL)
.then((response) => response.json())
.then((data) => {
this.setState({
unit: '°F',
currentWeather: {
main: data.weather[0].main,
desc: data.weather[0].description,
temp: data.main.temp,
}
});
})
.catch(() => {console.log('something went wrong, but we caught the error')});
}
unitHandler(e) {
function convertToCelsius(fahrenheit) {
return ((fahrenheit-32)*5/9)
}
function convertToFahrenheit(celsius) {
return ((celsius*9/5) + 32)
}
//if fahrenheit is checked
if(e.target.value === 'fahrenheit') {
const fahrenheitTemp = convertToFahrenheit(this.state.currentWeather.temp);
this.setState(prevState => ({
unit: '°F',
currentWeather: {
...prevState.currentWeather,
temp: fahrenheitTemp,
}
}));
}
//otherwise, celsius is checked
else {
const celsiusTemp = convertToCelsius(this.state.currentWeather.temp);
this.setState(prevState => ({
unit: '°C',
currentWeather: {
...prevState.currentWeather,
temp: celsiusTemp,
}
}));
}
}
render() {
return (
<div className='weather-app'>
<LocationInput getWeather={this.getWeather} unitHandler={this.unitHandler}/>
<CurrentWeather weatherStats={this.state.currentWeather} unit={this.state.unit} />
</div>
)
}
}
// Component where you enter your City and State
function LocationInput(props) {
return (
<div className='location-container'>
<form className='location-form' onSubmit={props.getWeather}>
<input type='text' name='city' placeholder='City'/>
<input type='text' name='country' placeholder='Country'/>
<button>Search</button>
<UnitConverter unitHandler={props.unitHandler} />
</form>
</div>
)
}
// Component to convert all units (fahrenheit <---> Celsius)
function UnitConverter(props) {
return (
<div className='unit-converter' onChange={props.unitHandler}>
<label for='fahrenheit'>
<input type='radio' name='unit' value='fahrenheit' defaultChecked/>
Fahrenheit
</label>
<label for='celsius'>
<input type='radio' name='unit' value='celsius'/>
Celsius
</label>
</div>
)
}
// Base weather component (intention of making specialized components for weekly forecast)
function Weather (props) {
const icons = {
thunderstorm: <i class="fas fa-bolt"></i>,
drizzle: <i class="fas fa-cloud-rain"></i>,
rain: <i class="fas fa-cloud-showers-heavy"></i>,
snow: <i class="far fa-snowflake"></i>,
clear: <i class="fas fa-sun"></i>,
atmosphere: 'No Icon Available',
clouds: <i class="fas fa-cloud"></i>,
};
let currentIcon = icons[props.weatherStats.main.toLowerCase()];
console.log(currentIcon);
return (
<div className={'weather-' + props.type}>
<h1>{props.location}</h1>
<h2>{props.day}</h2>
<figure className='weather-icon'>
<div className='weather-icon'>
{currentIcon}
</div>
<figcaption>
<h3 className='weather-main'>{props.weatherStats.main}</h3>
<div className='weather-desc'>{props.weatherStats.desc}</div>
{props.weatherStats.temp && <div className='weather-temp'>{Math.round(props.weatherStats.temp)}{props.unit}</div>}
</figcaption>
</figure>
</div>
)
}
// Using the specialization concept of React to create a more specific Weather component from base
function CurrentWeather(props) {
const dateObj = new Date();
const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'];
const currentDay = days[dateObj.getDay()];
return (
<Weather
type={'current'}
weatherStats={props.weatherStats}
day={currentDay}
unit={props.unit}
/>
)
}
ReactDOM.render(<App />, root);
.weather-app {
text-align: center;
}
.weather-current {
display: inline-block;
}
.wf-container {
display: flex;
justify-content: center;
align-items: center;
}
<script src="https://use.fontawesome.com/releases/v5.5.0/js/all.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div class="root"></div>
最佳答案
类组件中的 return()
和函数组件中的区别,render()
在返回 dom 之前总是会重新计算其中的值,从而改变您在功能组件中的 props 可能不会返回所需的值。
你可能想尝试这个:
let currentIcon = () => icons[props.weatherStats.main.toLowerCase()]
在您的返回中,将 {currentIcon}
更改为 {currentIcon()}
您可能需要考虑重新命名变量,例如 let getWeatherIcon
关于javascript - 重新渲染组件不会更新功能组件内的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53626974/
我错过了什么,我已完成 的安装指南中要求的所有步骤 native 脚本 运行 tns doctor 给我以下输出... C:\abc\xyz>tns doctor √ Getting environm
尝试从 {addToCart(book)}}/>}> 传递数据至}> 问题: 购物车 ( render={()=> ) 收到 null,但没有收到我尝试发送的对象 已放置“console.log...
这是 _app.tsx 的外观: function MyApp({ Component, pageProps }: AppProps) { return } 我在构建项目时遇到了这个错误: Ty
我的 Laravel Vue 组件收到以下警告: [Vue warn]: Avoid mutating a prop directly since the value will be overwrit
根据这个example更详细this one我刚刚遇到了一件奇怪的事情...... 如果我使用方法作为 addTab(title,icon,component) 并且下一步想使用 setTabComp
目前我有一个捕获登录数据的表单,一个带有 TIWDBGrid 的表单,它应该返回与我从我的 mysql 数据库登录时创建的 user_id 关联的任何主机,以及一个共享数据模块。 下面是我的登录页面代
在我的react-native应用程序中,我目前有一个本地Android View (用java编写)正确渲染。当我尝试将我的react-native javascript 组件之一放入其中时,出现以
我为作业编写了简单的代码。我引用了文档和几个 youtube 视频教程系列。我的 react 代码是正确的我在运行代码时没有收到任何错误。但是这些 react-boostrap 元素没有渲染。此代码仅
几周前我刚刚开始使用 Flow,从一周前开始我就遇到了 Flow 错误,我不知道如何修复。 代码如下: // @flow import React, { Component } from "react
我想在同一个 View 中加载不同的 web2py 组件,但不是同时加载。我有 5 个 .load 文件,它们具有用于不同场景的表单字段,这些文件由 onchange 选择脚本动态调用。 web2py
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 6年前关闭。 Improve t
Blazor 有 InputNumber将输入限制为数字的组件。然而,这呈现了一个 firefox 不尊重(它允许任何文本)。 所以我尝试创建一个过滤输入的自定义组件: @inherits Inpu
我在学习 AngularDART 组件时编写了以下简单代码,但没有显示任何内容,任何人都可以帮助我知道我犯了什么错误: 我的 html 主文件:
我想在初始安装组件时或之后为 div 设置动画(淡入)。动画完成后,div 不应消失。我正在尝试使用 CSSTransition 组件并查看 reactcommunity.org 上的示例,但我根本无
我需要一个 JSF 组件来表示甘特图。是否有任何组件库(如 RichFaces)包含这样的组件? 最佳答案 JFreeChart有甘特图和PrimeFaces有一个图像组件,允许您动态地流式传输内容。
从软件工程的角度来看,组件、模块和子系统之间有什么区别? 提前致谢! 最佳答案 以下是 UML 2.5 的一些发现: 组件:该子句指定一组结构,可用于定义任意大小和复杂性的软件系统。特别是,它将组件指
我有使用非托管程序集(名为 unmanaged.dll)的托管应用程序(名为 managed.exe)。到目前为止,我们已经创建了 Interop.unmanaged.dll,managed.exe
我有一个跨多个应用程序复制的 DAL(我知道它的设计很糟糕,但现在忽略它),我想做的是这个...... 创建一个将通过所有桌面应用程序访问的 WCF DAL 组件。任何人都可以分享他们对关注的想法吗?
我有一个 ComboBox 的集合声明如下。 val cmbAll = for (i /** action here **/ } 所有这些都放在一个 TabbedPane 中。我想这不是问题。那么我
使用 VB6 创建一个 VB 应用程序。应用程序的一部分显示内部的闪存。 当我使用 printform它只是打印整个应用程序。我不知道如何单独打印闪光部分。任何帮助,将不胜感激!.. 谢谢。 最佳答案
我是一名优秀的程序员,十分优秀!