Die Lösung, mit der ich arbeiten kann - ich frage mich, ob es einen besseren Weg gibt. Grundsätzlich gebe ich Delete als Requisiten von CoursesPage> CourseList> CourseListRow weiter. CourseListRow ist der Ort, an dem onDelete ausgelöst wird, und ich gebe die ID des zu löschenden Kurses über event.target.value an die Funktion deleteCourse in der Container-Komponente CoursesPage weiter.React-Redux, Verweis auf Container-Methode viele Ebenen tief?
Gibt es einen saubereren Weg, dies zu tun? Ist die Verwendung von Kontext in diesem Fall sinnvoll?
Verfahren in Container-Komponente Render:
CoursesPage.js
render() {
const {courses} = this.props;
return (
<div>
<h1>Courses</h1>
<input type="submit"
value="Add Course"
className="btn btn-primary"
onClick={this.redirectToAddCoursePage}/>
<CourseList
courses={courses}
onDelete={this.deleteCourse}/>
</div>
);
}
1. Stufe:
CourseList.js
import React, {PropTypes} from 'react';
import CourseListRow from './CourseListRow';
const CourseList = ({courses, onDelete}) => {
return (
<table className="table">
<thead>
<tr>
<th> </th>
<th>Title</th>
<th>Author</th>
<th>Category</th>
<th>Length</th>
</tr>
</thead>
<tbody>
{courses.map(course =>
<CourseListRow key={course.id} course={course} onDelete={onDelete}/>
)}
</tbody>
</table>
);
};
CourseList.propTypes = {
courses: PropTypes.array.isRequired
};
export default CourseList;
2. Stufe:
CourseListRow.js
import React, {PropTypes} from 'react';
import {Link} from 'react-router';
const CourseListRow = ({course, onDelete}) => {
return (
<tr>
<td><a href={course.watchHref} target="_blank">Watch</a></td>
<td><Link to={'/course/' + course.id}>{course.title}</Link></td>
<td>{course.authorId}</td>
<td>{course.category}</td>
<td>{course.length}</td>
<td>
<button
type="submit"
name="deleteCourseButton"
onClick={onDelete}
value={course.id}
> Delete </button>
</td>
</tr>
);
};
CourseListRow.propTypes = {
course: PropTypes.object.isRequired
};
export default CourseListRow;
Warum Kontext hinzufügen? Wie wäre es, wenn Sie Ihre Löschaktion einfach von CourseListRow aus senden? – azium
Dachte daran, ich habe es nicht getan, weil ich versuchte, mit der Konvention der Containerteile Umgang mit Redux zu halten ... würden Sie einfach die Aktion von CourseListRow versenden? – matthewalexander
Die Art, wie Sie es haben oder aus der Reihe versenden sind Ihre besten Optionen, und beide sind in Ordnung. "dumme" Komponenten sind wiederverwendbarer, aber das ist ein Kompromiss, den Sie entscheiden müssen, was wert ist – azium