我有两个组件Display.jsx和DisplayList.jsx。组件协同工作以显示本地存储中的值。问题在于DisplayList.JSX handleEdit()方法切片。
Github项目
我的想法:
我在这个论坛上问如何删除本地存储值,得到了这个答案,没有解释:堆栈溢出问题
data = [
...data.slice(0, index),
...data.slice(index + 1)
];
它可以工作,但现在我需要做类似的切片来编辑旧的存储值并用新的存储值替换。但是我不知道怎么做。
总结:在方法handleEdit()中的DisplayList.jsx中,需要从本地存储中获取值,并使用this.state电子邮件和this.state密码值进行覆盖。如果有人能够解释此过程,将获得额外奖励。
Display.jsx
import React, { Component } from 'react'
import {DisplayList} from './DisplayList';
class Display extends Component {
constructor(props){
let data = JSON.parse(localStorage.getItem('data'));
super(props)
this.state = {
data: data,
}
// Methods
this.displayValues = this.displayValues.bind(this);
}
displayValues(){
return this.state.data.map((data1, index) =>
<DisplayList
key = {index}
email = {data1.email}
password = {data1.password}
updateList = {this.updateList}
/>
)
}
// This is the method that will be called from the child component.
updateList = (data) => {
this.setState({
data
});
}
render() {
return (
<ul className="list-group">
{this.displayValues()}
</ul>
)
}
}
export default Display;
DisplayList.jsx
import React, { Component } from 'react'
import {Button, Modal, Form} from 'react-bootstrap';
export class DisplayList extends Component {
constructor(props){
super(props)
this.state = {
email: '',
password: '',
show: false,
};
// Methods
this.handleDelete = this.handleDelete.bind(this);
this.onChange = this.onChange.bind(this);
// Edit Modal
this.handleShow = this.handleShow.bind(this);
this.handleClose = this.handleClose.bind(this);
this.handleEdit = this.handleEdit.bind(this);
}
onChange(event){
this.setState({
[event.target.name]: event.target.value
})
};
handleClose(){
this.setState({show: false});
}
handleShow(){
this.setState({show: true});
}
handleEdit(event){
event.preventDefault();
this.setState({show: false});
let data = JSON.parse(localStorage.getItem('data'));
for (let index = 0; index < data.length; index++) {
if( this.props.email === data[index].email &&
this.props.password === data[index].password){
}
}
localStorage.setItem('data', JSON.stringify(data));
this.props.updateList(data);
}
handleDelete(){
let data = JSON.parse(localStorage.getItem('data'));
for (let index = 0; index < data.length; index++) {
if(this.props.email === data[index].email &&
this.props.password === data[index].password){
data = [
...data.slice(0, index),
...data.slice(index + 1)
];
}
}
localStorage.setItem('data', JSON.stringify(data));
this.props.updateList(data);
}
render() {
return (
<div className = "mt-4">
<li className="list-group-item text-justify">
Email: {this.props.email}
<br />
Password: {this.props.password}
<br />
<Button onClick = {this.handleShow} variant = "info mr-4 mt-1">Edit</Button>
<Button onClick = {this.handleDelete} variant = "danger mt-1">Delete</Button>
</li>
<Modal show={this.state.show} onHide={this.handleClose}>
<Modal.Header closeButton>
<Modal.Title>Edit Form</Modal.Title>
</Modal.Header>
<Modal.Body>
<Form>
<Form.Group controlId="formBasicEmail">
<Form.Label>Email address</Form.Label>
<Form.Control
autoComplete="email" required
name = "email"
type="email"
placeholder="Enter email"
value = {this.state.email}
onChange = {event => this.onChange(event)}
/>
</Form.Group>
<Form.Group controlId="formBasicPassword">
<Form.Label>Password</Form.Label>
<Form.Control
autoComplete="email" required
name = "password"
type="password"
placeholder="Password"
value = {this.state.password}
onChange = {event => this.onChange(event)}
/>
</Form.Group>
</Form>
</Modal.Body>
<Modal.Footer>
<Button variant="secondary" onClick={this.handleClose}>
Close
</Button>
<Button variant="primary" onClick={this.handleEdit}>
Save Changes
</Button>
</Modal.Footer>
</Modal>
</div>
)
}
}
在localstore中编辑数据时,首先从localstore获取该值,如果该值退出,则搜索该值的索引,然后在该索引处更新该值。
你可以用多种方法做到这一点,但是我发现映射列表是实现这一点的最简单的方法
handleEdit(event){
event.preventDefault();
this.setState({show: false});
let data = JSON.parse(localStorage.getItem('data'));
data = data.map((value) => {
// check if this is the value to be edited
if (value.email === this.props.email && value.password = this.props.password) {
// return the updated value
return {
...value,
email: this.state.email,
password: this.state.password
}
}
// otherwise return the original value without editing
return value;
})
localStorage.setItem('data', JSON.stringify(data));
this.props.updateList(data);
}
要理解上面的代码,你需要知道...
是做什么的。在要点中,它被称为扩展语法,它允许迭代,如数组表达式或字符串,在需要零个或多个参数(函数调用)或元素(数组文字)或对象表达式的地方进行扩展在需要零个或多个键值对(对象文字)的地方展开。您可以阅读这篇文章以及了解更多关于它
三个点在图中的作用是什么
现在来看看代码
{
...value, // spread the original value object
email: this.state.email, // override email value from value object with state.email
password: this.state.password // override password value from value object with state.password
}
我的数据库中有几个存储过程,结构如下: 我被要求在每个有它的过程中用另一个子句替换中的表。 我经过了很多研究,但我应该创建一个自己工作的脚本,我还没有找到合适的东西。例如,我找到了显示存储过程源代码的,但是有没有办法将其放入变量中以便编辑它?
localStorage 本地存储 存储针对QQ帐号隔离 数据存储于本地文件中。游戏结束后不会被删除 函数 key( index) 获取对应索引的key 手q 版本7.8.5 参数 参数名 类型 说明 index number 索引值 返回值 类型 说明 string 说明 示例 var stringKey = BK.localStorage.key(0); getItem( key) 获取ke
本地存储提供了localstore和sessionstore两个类。localstore使用本地文件持久化数据,因此该类存储的数据不会失效。sessionstore存储的数据会在插件运行结束时清空,因此有效期为插件运行期。localstore和sessionstore的API接口一致。 set QN.localstore.set({ query: { key: 'name'
我正在尝试在谷歌云上迁移我的rails应用程序。我已将活动存储与地面军事系统上创建的存储桶连接起来。我上传了bucket中的文件夹“storage”,但应用程序中的所有图像都有404错误。 如何正确迁移GCS中的本地存储文件夹? 谢谢你的建议
问题内容: 目前,我正在使用一项服务来执行操作,即从服务器检索数据,然后将数据存储在服务器本身上。 取而代之的是,我想将数据放入本地存储中,而不是将其存储在服务器上。我该怎么做呢? 问题答案: 这是我存储和检索到本地存储的代码的一部分。我使用广播事件来保存和恢复模型中的值。
问题内容: 除了是非持久性的并且仅限于当前窗口之外,会话存储与本地存储相比是否还有其他好处(性能,数据访问等)? 问题答案: localStorage和sessionStorage都扩展了Storage。除了的预期的“非持久性”外,它们之间没有区别。 也就是说,存储在中的数据将 一直保留到明确删除为止 。所做的更改将被保存,并且可用于当前和将来对该站点的所有访问。 对于, 更改仅在每个选项卡上可用