javascript - 通过反应组件传递索引
问题描述
我正在研究 Reactjs,我正在构建一个任务项目(CRUD),但我被困在编辑点,编辑部分在另一个组件中,我无法发送任务的索引编辑,我阅读了文档,但我无法做到,请如果有人能看到我的代码并告诉我做错了什么。
应用程序(主要)代码
import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';
// data
import { todos2 } from './todos.json';
// subcomponents
import TodoForm from './components/TodoForm';
import TodoFormEdit from './components/TodoFormEdit';
class App extends Component {
constructor() {
super();
this.state = {
todos2, mode:'view'
}
this.handleAddTodo = this.handleAddTodo.bind(this);
this.handleEdit2 = this.handleEdit2.bind(this);
}
removeTodo(index) {
this.setState({
todos2: this.state.todos2.filter((e, i) => {
return i !== index
})
});
}
handleAddTodo(todo) {
this.setState({
todos2: [...this.state.todos2, todo]
})
}
handleEdit2(i) {
this.setState({mode: 'edit'});
//const mode = mode === 'edit';
alert(i);
/* alert(this.state.todos2[i].title);
alert(this.state.todos2[i].priority);
alert(this.state.todos2[i].description);
alert(this.state.todos2[i].language);*/
}
render() {
const todosAll = this.state.todos2.map((todo, i) => {
return (
<div className="col-md-4" key={i}>
<div className="card mt-4">
<div className="card-title text-center">
<h3>{todo.title} - { i } </h3>
<span className="badge badge-pill badge-danger ml-2">
{todo.priority}
</span>
</div>
<div className="card-body">
<div>
{todo.description}
</div>
<div>
{todo.language}
</div>
</div>
<div className="card-footer">
<button
className="btn btn-danger"
onClick={this.removeTodo.bind(this, i)}>
Delete
</button>
<button
className="btn btn-warning ml-2"
onClick={this.handleEdit2.bind(this, i)}>
Edit
</button>
</div>
</div>
</div>
)
});
return (
<div className="App">
<nav className="navbar navbar-dark bg-dark">
<a className="navbar-brand" href="/">
Tasks
<span className="badge badge-pill badge-light ml-2">
{this.state.todos2.length}
</span>
</a>
</nav>
<div className="container">
<div className="row mt-4">
<div className="col-md-4 text-center">
<img src={logo} className="App-logo" alt="logo" />
{/* <TodoForm onAddTodo={this.handleAddTodo} ></TodoForm> */ }
{this.state.mode === 'view' ? (
<TodoForm onAddTodo={this.handleAddTodo} />
) : (
<TodoFormEdit index={this.state.i}/>
)}
</div>
<div className="col-md-8">
<div className="row">
{todosAll}
</div>
</div>
</div>
</div>
</div>
)
}
}
export default App;
和编辑组件:
import React, { Component } from 'react';
// data
import { todos2 } from '../todos.json';
class TodoFormEdit extends Component {
constructor (i) {
super(i);
this.state = {
todos2
};
}
render() {
return (
<div>
{this.state.todos2[0].title}
</div>
)
}
}
export default TodoFormEdit;
解决方案
你正在传递this.state.i
:
<TodoFormEdit index={this.state.i}/>
不清楚你在哪里设置它——我看到mode
并todos2
声明了属性,我在任何地方都看不到i
。
推荐阅读
- android - android - 在某些手机上改造返回 null
- flutter - 在 ListTile 中放置两个尾随图标
- c# - 在面板的滚动条上设置宽度
- batch-file - 启动特定服务集的批处理脚本
- r - 如果列包含字符串,如何将列标题添加到新列
- node.js - 从 NodeJS Lambda 调用安全 API
- php - 如何使用从使用 PHP 的数组中的单个元素派生的图像创建可点击链接?
- apache-camel - 如何使用 Apache camel RAW(value) 作为密码
- java - 使用 OneToOne 映射反序列化春季休眠中的异常
- excel - 如何在一张纸上使用日期参考作为将数据粘贴到其他多张纸上但复制到同一张纸上以进行粘贴的地方