- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个数组,每次调用 componentDidMount() 时都会获取 API 数据。我有一个默认 bool 值 true 的对象被推送到数组中的每个元素。已设置 onClick 函数,以便当单击特定元素时,其 bool 值将更改为 false,并将数组放置在 localStorage 中。
我需要数据数组在每次重新加载页面时不断刷新,因此我在我的 componentDidMount() 方法中进行了检查,该方法仅从我刚刚保存在 localStorage 中的数组接收 bool 值。
尽管这可行,但 bool 值是根据索引分配的,而不是针对元素本身。这里的问题是,如果位置 2 中的元素“A”最初设置为 false,然后在另一个 API 调用之后与位置 3 中的元素“B”交换,则 bool 值将不正确,就像“B”现在一样为假,“A”现在为真。
import React from 'react';
import StarBorder from '@material-ui/icons/StarBorder';
import Star from '@material-ui/icons/Star';
import axios from 'axios';
class Test extends React.Component {
constructor(props) {
super(props);
this.state = {
data: [],
}
}
componentDidMount() {
axios.get('https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&order=market_cap_desc&per_page=100&page=1&sparkline=true')
.then(res => {
const data = res.data;
const fromLocalStorage = localStorage.getItem('test');
if (localStorage.getItem('test')) {
const dataFromLocalStorage = JSON.parse(fromLocalStorage);
this.setState({ data: data.map((x, i) => ({...x, starIcon: dataFromLocalStorage[i].starIcon }))})
} else {
this.setState({ data: data.map(x => ({...x, starIcon: true}))})
}
})
}
handleClick = (n) => {
this.setState(prevState => ({
data: prevState.data.map((x) => (x === n ? {
...x,
starIcon: !x.starIcon
} : x))
})
, () => {
localStorage.setItem('test', JSON.stringify(this.state.data));
});
}
render() {
return (
<div>
<table border="1">
<thead>
<tr>
<td>Rank</td>
<td>Icon</td>
<td>Name</td>
<td>Price</td>
</tr>
</thead>
<tbody>
{this.state.data.map((n, i) => {
return (
<tr>
<td>{n.market_cap_rank}</td>
<td> <span onClick={() => this.handleClick(n)}> {n.starIcon ? <StarBorder/> : <Star /> } </span> </td>
<td>{n.name}</td>
<td>{n.current_price}</td>
</tr>
);
})}
</tbody>
</table>
</div>
);
}
}
export default Test;
Codesandbox 链接 https://codesandbox.io/s/shy-fog-7yplb
如果您要通过单击 true 到 false 来更改位置 40 中名为“Algorand”的项目,则可以按预期工作。然而,API 调用将刷新其余数据,“Algorand”可能不再位于位置 40,但位置 40 中的 bool 值仍然为 false,并且不会映射到“Algorand”
最佳答案
尝试在您的 componentDidMount 中使用它
const fromLocalStorage = localStorage.getItem("test");
if (localStorage.getItem("test")) {
const dataFromLocalStorage = JSON.parse(fromLocalStorage);
let updatedData = data.map((d) => {
const result = dataFromLocalStorage.find( dfls => dfls.id === d.id );
return {...d, starIcon: result.starIcon} ;
})
this.setState({
data: updatedData
});
} else {
this.setState({ data: data.map(x => ({ ...x, starIcon: true })) });
}
我在这里所做的是,当您在状态中映射刷新的数据时,我不是匹配整个对象(这将无法正确工作),而是从数组中找到正确的对象并使用其中的 startIcon 。
关于javascript - 如何在 ReactJS 中使用 LocalStorage 更新状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57491061/
我是 Angular 新手。使用 $localstorage(ngStorage) 是否有任何特定的原因而不是常规的 javascript localstorage 有什么区别。 谁能给我解释一下吗?
这个问题说明了一切。我意识到所有选项都可以在最新的浏览器中使用,但是语义上最好的选择是什么?为什么? 最佳答案 根据 W3C 标准,正确的是 window.localStorage,因为 localS
我想不出一个好的标题,所以希望可以。 我正在做的是创建一个离线 HTML5 webapp。 “出于某些原因”我不希望将某些文件放在缓存 list 中,而是希望将内容放在 localStorage 中。
我最近问了a question about LocalStorage .使用 JSON.parse(localStorage.item) 和 JSON.parse(localStorage['item
我最近问了a question about LocalStorage .使用 JSON.parse(localStorage.item) 和 JSON.parse(localStorage['item
我最近问过a question about LocalStorage 。使用 JSON.parse(localStorage.item) 和 JSON.parse(localStorage['item
我在将本地存储的定价添加到其他字段时遇到问题。如果我将 beforeNoonNPSlot 的价格设置为 2,但我将 matineeNPSlot 的字段留空(它应该保留分配给的任何价格)最后)。然后在我
我需要从 localStorage 对象变量中删除对象键而不从 localStorage 中删除键 let obj = localStorage; let keys = Object.keys(loc
根据我所读到的内容,我希望以下代码能够工作。 此代码是函数的一部分,该函数应该通过用下一个更高的 localStorage 变量覆盖它来删除 localStorage 变量。一旦没有更多内容可供复制,
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: JavaScript property access: dot notation vs. brackets? 我是
编写localStorage['key'] = value或localStorage.setItem('key', value)有区别吗? 我看到了this question标记为重复,但在开发人员工
我一直在做以下事情: var store = window.localStorage; store.setItem() 但现在我看到代码是这样做的: localStorage.setItem() 两者
我在 Chrome 上遇到此错误。不知道为什么会发生。任何帮助!我正在使用 Backbone.localStorage 插件和 Backbone。我在以下行中收到错误: localStorage: B
如果我尝试以下代码: var c = new Backbone.Collection(); c.localStorage = new Backbone.LocalStorage("items");
我想使用 localStorage 存储用户输入值,然后在倒计时器中使用该值。 这是用户输入数据的 HTML: Work Time
我有一个适用于 Mac 和 Linux 用户但不适用于 Windows 用户的 Chrome 扩展程序。当我进入控制台并在 localStorage 中设置一个项目时,它工作正常,但是当用户尝试使用扩
在这里浏览所有问题/答案,但找不到解决我的问题的方法。条件('localStorage' in window)返回 true但是 localStorage 的对象本身仍然是 undefined . 设
使用下面的代码,我创建一个 localstorage 变量,如果未定义,则其键为 quote = 1。然而,当最终使用相同的引号键再次调用它时,即使使用了 Number() 函数,它也会变成 11 而
我上次检查时,以下两行返回 true: null == localStorage["foo"]; null == localStorage.getItem("foo"); 将 null 替换为 und
我正在尝试在 NextJS 静态站点上使用 localStorage,但遇到 localStorage 未定义错误。 我的错误显示组件的代码是: export default function Cat
我是一名优秀的程序员,十分优秀!