如何从状态获取数据并编辑表单中的元素?

2023-12-26

我想要得到如下效果:点击按钮 -> 调用函数切换 -> 将被点击的item的索引保存在this.state.index状态 -> 显示编辑表单 ---> 将被点击的元素的数据获取到表单->编辑数据->保存

当尝试调用切换函数并编写index在某种状态下,索引不保存。将索引保存在状态后,我想使用它并可以访问单击的元素todo = this.state.todos [this.props.index]。我发送点击的数据todo在表单属性中。在表格中,他通过以下方式引用了这一点value = this.props.todo.date。我正在使用date-picker-react图书馆。有人可以指导我吗?


App

class App extends Component {
  constructor() {
    super();

   this.state = {

     todos: [],
     index: null,
     editing: false
   }; 
 }

 update = (propertyName) => (event) => {
   const { todo } = this.state;
   const newTodo = {
     ...todo,
     [propertyName]: event.target.value
   };
    this.setState({ todo: newTodo });
  }

  toggle = (index) => {
    this.setState({
    editing: !this.state.editing,
    index: index
  })
 }


 createTodo = (todo) => {
    const new = this.state.todos.slice();
    new.push(todo);
    this.setState({todos: new});
 }

 render () {
    return (
          <ul>
            {
              this.state.todos
                .map(index => {
                  <Todo
                   key= {index}
                   index = {this.state.index}
                   toggle = {this.toggle} 
                   todo={this.state.todos[index]} 
                   editing = {this.state.editing}
                   update = {this.update}
                 />
               })
            }
         </ul>      
   );
 }
}

 export default App;

待办/待办

class Todo extends Component {
  render() {

    if (this.props.isEditing) {
      return (
          <EditForm
            todo = {this.props.todos[this.props.index]} 
            update = {this.props.update}
          />
      )
    }


    return (
      <li>
        <div>
          {this.props.todo.date}
        </div>
        <div>
          {this.props.todo.description}
        </div>
          <button onClick={() => this.props.toggle(index)}></button>  
      </li>
    )
  }
}

export default Todo;

编辑表单/编辑表单

 class EditForm extends Component {
    constructor(){
    super();
    this.state = {
      startDate: new Date()
    }
  }

  todo(e) {
    event.preventDefault();

    const todo = {
      date: this.state.startDate,
      description: this.desc.value
    }

   this.props.addTodo(todo);
  }

  handleChange = (date) => {
    this.setState({
      startDate: date
    });
  }

  render() {
    return (
      <form onSubmit={(e) => this.todo(e)}>
        <DatePicker
          selected={this.state.startDate}
          onChange={this.update('date')} value= 
        {this.state.todo.date}
          showTimeSelect
          timeFormat="HH:mm"
          value={todo.date}
          dateFormat="yy-MM-dd, hh:mm"
          timeCaption="time"
        /> 
        <textarea ref={(input) => this.description = input} value= 
        {todo.description} onChange={this.update('description')} 
        value={this.state.todo.description}></textarea>
        <button type="submit">Save</button>
      </form>     
    )
  }
}

    export default EditForm;

让每个待办事项管理其状态,编辑时它将显示该待办事项的表单。

class Todo extends Component {

  state = {
    isEditing: false,
    startDate: new Date(),
    description: '',
  }

  setEditing = () => {
    this.setState({
      isEditing: !this.state.isEditing
    })
  }

  handleChange = (date) => {
    this.setState({
      startDate: date
    });
  }

  handleDescription = (evt) => {
    this.setState({
      description: evt.target.value
    })
  }

  formatDate = () => {
    const d = this.state.startDate;

    return d.getFullYear().toString().substring(2) + "-" +
      ("00" + (d.getMonth() + 1)).slice(-2) + "-" +
      ("00" + d.getDate()).slice(-2) + ", " +
      ("00" + d.getHours()).slice(-2) + ":" +
      ("00" + d.getMinutes()).slice(-2)
  }

  onSave = () => {

    const { description } = this.state;

    this.props.update(this.props.index, { description, date: this.formatDate() });

    this.setState({
      isEditing: false
    })
  }

  componentDidMount = () => {
    const { todo } = this.props;

    this.setState({
      description: todo.description,
      startDate: new Date(todo.date)
    })
  }

  render() {

    return (
      <div>
        {this.state.isEditing

          ? (<EditForm
            handleChange={this.handleChange}
            description={this.state.description}
            startDate={this.state.startDate}
            handleDescription={this.handleDescription}
            onSave={this.onSave}
          />)
          : (
            <li>
              <div>
                {this.props.todo.date}
              </div>
              <div>
                {this.props.todo.description}
              </div>
              <button onClick={() => this.setEditing()}>Edit</button>
            </li>
          )

        }
      </div>
    )
  }
}

编辑表格

class EditForm extends Component {
  render() {
    return (
      <div>
        <DatePicker
          selected={this.props.startDate}
          onChange={this.props.handleChange}
          showTimeSelect
          timeFormat="HH:mm"
          value={this.props.startDate}
          dateFormat="yy-MM-dd, hh:mm"
          timeCaption="time"
        />
        <textarea onChange={(e) => this.props.handleDescription(e)} value={this.props.description}></textarea>
        <button onClick={this.props.onSave} type="submit">Save</button>
      </div>
    )
  }
}

Demo https://stackblitz.com/edit/react-todo-jp

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从状态获取数据并编辑表单中的元素? 的相关文章

随机推荐

  • 使用 Laravel Passport oauth/token 发送更多数据

    所以 我正在使用 Laravel Passport 到目前为止一切正常 但是 我想对护照代码进行一些小的更改 好吧 我希望不在供应商文件夹中 一旦我会要求用户更改其密码 以防他正在进行第一次登录 所以 我需要的是两件事 我相信 1 如何在
  • mysql 查询优化

    我的 x 表中有大约 总共 1 049 906 个 查询花费了 0 0005 秒 如果我只是检索尝试检索特定字段记录 花了不到6分钟 这是我的查询 SELECT CUSTOMER CODE FROM X TBL 客户代码 gt 唯一 上述查
  • 如何配置 Express 响应对象以自动向 JSON 添加属性?

    我有一个对象 var obj stuff stuff 在 Express 中 我将其发送给客户端 如下所示 res json obj 有没有办法配置响应对象自动将属性添加到它生成的 json 中 例如 输出 status ok data s
  • PHP 无需 cURL 即可获取 http 标头响应代码

    我编写了一个类来检测 cURL 是否可用 如果可用 则使用 cURL 执行 GET POST DELETE 在我使用的 cURL 版本中curl getinfo curl CURLINFO HTTP CODE 获取 HTTP 代码 如果 c
  • 监控传出互联网流量

    有没有办法以编程方式监控互联网流量 我想记录用户在互联网上访问的页面 这可以通过 NET 代码实现吗 是否有可用于检索数据的第 3 方 NET 组件 有关互联网流量的信息必须存储到数据库中 因此我无法使用 IE 的插件或其他东西 我们还希望
  • Python 3:从元组列表中删除空元组

    我有一个元组列表 内容如下 gt gt gt myList c e ca ea d do dog ear eat cat car dogs cars done eats cats ears don 我希望它是这样读的 gt gt gt my
  • 标准输出未正确传递?

    特殊的问题 由于某种原因 标准输出中的值无法被正确识别 我想做的是 grep 正在侦听的端口的值并尝试匹配 如果定义的端口存在 即 被监听产生一条消息 如果不存在 则产生另一条消息 name check prometheus status
  • 搜索并替换为 ruby​​ 正则表达式

    我的 MySQL 列中有一个包含 HTML 的文本 blob 字段 我必须更改一些标记 所以我想我会在 ruby 脚本中完成它 Ruby 在这里无关紧要 但很高兴看到它的答案 标记如下所示 h5 foo h5 table tbody tbo
  • 在 C++ 中忽略 std::cin 上的 EOF

    我有一个实现交互式 shell 的应用程序 类似于 Python 控制台 irb 的工作方式 现在的问题是 如果用户不小心点击了 DEOF 已发出 我的getline 调用返回一个空字符串 我将其视为 无输入 并再次显示提示 这会导致打印提
  • 从 Google Scholar 搜索结果中抓取和解析引文信息

    我有大约 20000 篇文章标题的列表 我想scrape他们来自谷歌学术的引用计数 我是 BeautifulSoup 库的新手 我有这个代码 import requests from bs4 import BeautifulSoup que
  • 接口中的只读和只写自动属性

    我读过自动实现的属性不能只读或只写 它们只能读写 然而 在学习界面时我遇到了foll 代码 它创建只读 只写和读写类型的自动属性 这是可以接受的吗 public interface IPointy A read write property
  • img = Image.open(fp) AttributeError: 类 Image 没有属性 'open'

    我想把图片做成PDF文件 我的代码如下 import sys import xlrd from PIL import Image import ImageEnhance from reportlab platypus import from
  • 如何确定 VS Code 使用的是哪个格式化程序?

    如果您安装了多个扩展 如何确定文档上正在运行哪个格式化程序 例如 我有几个可以格式化 HTML 的 HTML 扩展 但我不确定哪个扩展实际上正在格式化 或者是否有多个扩展 我什至不确定哪些扩展可能有助于诚实地格式化 最近 HTML 和 CS
  • IPN Paypal“官方”示例代码不起作用

    我有一个问题 我想他们还发现了很多其他问题 我正在尝试将 PayPal 支付系统集成到我的网站中 但 IPN 存在一些问题 我尝试了这段代码 在 github Paypal 上找到
  • rake db:seed 生成 ArgumentError: 缺少关键字: from, to

    我有一个数据库来种子来测试我的代码 当我跑步时rake db seed要为数据库播种 我收到以下错误 我预计控制台是空白的 这意味着数据已被播种 Error 19 19 41 master simple partials lab nouko
  • alembic + sqlalchemy 多个数据库

    在 Flask 中 我设置了 SQLAlchemy 以使用多个数据库 这些数据库是根据请求选择的 如中所述https quanttype net posts 2016 03 15 flask sqlalchemy and multitena
  • 使用 Debian 将 Google Cloud Filestore 挂载到 Docker 容器内

    我想将 Cloud Filestore 安装在 Debian 的 docker 容器内 当我尝试安装它时 我得到 mount nfs timeout set for Wed Feb 27 12 35 07 2019 mount nfs tr
  • NSStatusBar 中的 NSDatePicker NSSMenuItem 未接收输入

    不久前 我写了一个简单的日历菜单栏小部件 名为Day O http shauninman com archive 2011 10 20 day o mac menu bar clock 日历使用嵌套在添加到 NSStatusItem 的 N
  • 我可以通过 ruby​​ 驱动程序访问 mongo 的 geoNear 功能吗?

    我正在使用 ruby 驱动程序根据地理查询从 mongo 检索结果 我希望返回结果及其各自的距离 该功能可在 shell 中使用 geoNear 命令使用 db runCommand geoNear places near 50 50 nu
  • 如何从状态获取数据并编辑表单中的元素?

    我想要得到如下效果 点击按钮 gt 调用函数切换 gt 将被点击的item的索引保存在this state index状态 gt 显示编辑表单 gt 将被点击的元素的数据获取到表单 gt 编辑数据 gt 保存 当尝试调用切换函数并编写ind