为什么项目没有保存在 localStorage 上?
Why the item is not saved on the localStorage?
正在使用 React js 开发一个简单的项目。
我想要做的是将“项目”(它有一个供用户输入的输入字段)保存在 localStorage 中,目的是当用户重新加载或导航到其他组件时,该项目不会消失, 但它会在那里。
AddItem.js:
export default class AddItem extends React.Component {
userItems;
constructor(props) {
super(props);
this.state = {
content: "",
items: [],
};
}
update(event) {
this.setState({
message: event.target.value,
});
}
componentDidMount() {
this.userItems = JSON.parse(localStorage.getItem('items'));
if (localStorage.getItem('items')){
this.setState({
items: this.userItems.items,
message: this.userItems.message
})
}else {
this.setState({
items: [],
message: ""
})
}
}
componentWillUpdate(nextProps, nextState){
localStorage.setItem('item', JSON.stringify(nextState));
}
handleClick() {
var items = this.state.items;
items.push(this.state.message);
this.setState({
items: items,
content: "",
});
}
handleChanged(j, event) {
let items = this.state.items;
items[j] = event.target.value;
this.setState({
items: items,
});
}
问题是当我在输入字段中键入一个项目并重新加载页面时,该组件根本没有显示。
在应用程序中,在本地存储中,值显示在 google inspect:
但是,一旦我导航到另一个组件或重新加载该页面,存储就会像第一次一样变空。
我怎样才能让它发挥作用,以便当我导航到另一个页面时该值不会消失?
删除 componentWillUpdate
中的逻辑并将其移至 handleItemChanged
。像这样:
export default class AddItem extends React.Component {
userItems;
constructor(props) {
super(props);
this.state = {
content: "",
items: [],
};
}
updateMessage(event) {
this.setState({
message: event.target.value,
});
}
handleClick() {
var items = this.state.items;
items.push(this.state.message);
this.setState({
items: items,
content: "",
});
}
handleItemChanged(i, event) {
var items = this.state.items;
items[i] = event.target.value;
this.setState({
items: items,
});
localStorage.setItem('items', JSON.stringify({items, message :""}));
}
componentDidMount() {
this.userItems = JSON.parse(localStorage.getItem('items'));
if (localStorage.getItem('items')){
this.setState({
items: this.userItems.items,
message: this.userItems.message
})
}else {
this.setState({
items: [],
message: ""
})
}
}
renderRows() {
var context = this;
return this.state.items.map(function (o, i) {
return (
<tr key={"item-" + i}>
<td className="2">
<div>
<input
type="text"
value={o}
onChange={context.handleItemChanged.bind(context, i)}
</tr>
正在使用 React js 开发一个简单的项目。 我想要做的是将“项目”(它有一个供用户输入的输入字段)保存在 localStorage 中,目的是当用户重新加载或导航到其他组件时,该项目不会消失, 但它会在那里。
AddItem.js:
export default class AddItem extends React.Component {
userItems;
constructor(props) {
super(props);
this.state = {
content: "",
items: [],
};
}
update(event) {
this.setState({
message: event.target.value,
});
}
componentDidMount() {
this.userItems = JSON.parse(localStorage.getItem('items'));
if (localStorage.getItem('items')){
this.setState({
items: this.userItems.items,
message: this.userItems.message
})
}else {
this.setState({
items: [],
message: ""
})
}
}
componentWillUpdate(nextProps, nextState){
localStorage.setItem('item', JSON.stringify(nextState));
}
handleClick() {
var items = this.state.items;
items.push(this.state.message);
this.setState({
items: items,
content: "",
});
}
handleChanged(j, event) {
let items = this.state.items;
items[j] = event.target.value;
this.setState({
items: items,
});
}
问题是当我在输入字段中键入一个项目并重新加载页面时,该组件根本没有显示。
在应用程序中,在本地存储中,值显示在 google inspect:
但是,一旦我导航到另一个组件或重新加载该页面,存储就会像第一次一样变空。 我怎样才能让它发挥作用,以便当我导航到另一个页面时该值不会消失?
删除 componentWillUpdate
中的逻辑并将其移至 handleItemChanged
。像这样:
export default class AddItem extends React.Component {
userItems;
constructor(props) {
super(props);
this.state = {
content: "",
items: [],
};
}
updateMessage(event) {
this.setState({
message: event.target.value,
});
}
handleClick() {
var items = this.state.items;
items.push(this.state.message);
this.setState({
items: items,
content: "",
});
}
handleItemChanged(i, event) {
var items = this.state.items;
items[i] = event.target.value;
this.setState({
items: items,
});
localStorage.setItem('items', JSON.stringify({items, message :""}));
}
componentDidMount() {
this.userItems = JSON.parse(localStorage.getItem('items'));
if (localStorage.getItem('items')){
this.setState({
items: this.userItems.items,
message: this.userItems.message
})
}else {
this.setState({
items: [],
message: ""
})
}
}
renderRows() {
var context = this;
return this.state.items.map(function (o, i) {
return (
<tr key={"item-" + i}>
<td className="2">
<div>
<input
type="text"
value={o}
onChange={context.handleItemChanged.bind(context, i)}
</tr>