reactjs - useState 不重新渲染
问题描述
我有一个组件在状态变量更改时不会重新渲染,我不明白为什么。这是代码: -
export default function SalesItem(props) {
const classes = useStyles();
const api = new API();
const [salesItem, setSalesItem] = React.useState(null);
const [site, setSite] = React.useState(null);
useEffect(() => {
api.getSite(props.siteCode).then((site) => {
setSite(site);
api.getSalesItem(site.SiteID, props.salesItem).then((salesItem) => {
setSalesItem(salesItem);
})
})
}, [])
return (
<form className={classes.root} noValidate autoComplete="off">
<Input
defaultValue={salesItem === null ? "test" : salesItem.Description}
inputProps={{ 'aria-label': 'description' }}
fullWidth
/>
</form>
)
}
site 和 salesItem 的值确实发生了变化,但 Input 字段只显示“test”,这告诉我组件没有重新渲染,我不知道为什么。
解决方案
您应该设置value
而不是defaultValue
:
import React, { useState } from "react";
import "./styles.css";
export default function App() {
const [value, setValue] = useState("default value");
const updateValue = (e) => {
const newValue = e.target.value;
if (newValue !== value) {
setValue(newValue);
}
};
return (
<>
<button onClick={() => setValue("foo")}>inject value "foo"</button>
<button onClick={() => setValue("bar")}>Inject value "bar"</button>
<input value={value} onChange={updateValue} />
<p>Current value is: "{value}"</p>
</>
);
}
推荐阅读
- css - 在 Wordpress 中,mapbox 徽标在网格之外展开
- sql - SQL:检查一个数字是否在多个范围的范围内
- c# - Xamarin SQLite 数据库检查
- javascript - 从某个位置获取半径范围内的城市(Google Map API)
- python - SQL Server 连接 - 适用于 pyodbc,但不适用于 SQLAlchemy
- python - postgres10 的 psycopg2 编码错误
- swift - 如何实现垂直标签可可应用程序
- javascript - 如何在 ReactJs 中呈现 jsx 元素数组
- python-3.x - 如何在没有 python shell 的情况下获取键盘输入
- javascript - React-native CSS 使父容器透明