Я плохо знаком с редуксом и реагирую. Все еще делаю простые уроки. Мне удалось создать 2 простых компонента; один выводит на экран (в виде списка) все, что находится в массиве в хранилище с избыточностью, а другой компонент содержит кнопку и текстовое поле, которое в основном добавляет этот массив в хранилище.
Я хотел бы добавить функцию, которая позволит мне удалять конкретную запись в списке в зависимости от того, на что нажал пользователь. Я имею в виду создание <button>
рядом с каждым тегом <li>
, который будет отображаться при циклическом перемещении по массиву, и эти кнопки будут соответствовать соответствующим элементам списка. Но я не уверен, как это сделать.
Я пытался создать кнопку при создании каждого тега <li>
, но на консоли я получал сообщение о том, что каждому элементу в списке нужен уникальный идентификатор. Затем я решил создать в моем магазине еще один массив с именем buttons
, который будет содержать уникальный идентификатор, а также идентификатор списка, но он вышел из-под контроля. Я думаю, что я мог бы усложнить это. Вот что у меня на данный момент:
Компоненты:
List.jsx (отвечает за вывод списка)
import React from 'react'
import { connect } from "react-redux";
const ListComp = ({ lists }) => (
<div>
<ul>
{console.log(lists)}
{lists.map( element => (
<li key={element.id}>
{element.titleToBeAddedToList}
</li>
))}
</ul>
</div>
)
const mapStateToProps = state => {
return {
lists: state.lists
};
}
const List = connect(mapStateToProps)(ListComp)
export default List;
SubmitButton.jsx (отвечает за вывод кнопки и текстового поля)
import React from 'react'
import { connect } from "react-redux";
import uuidv1 from "uuid";
import { addList } from "../actions/index";
import { addButton } from "../actions/index"
function mapDispatchToProps(dispatch){
return {
addlist: article => dispatch(addList(article)),
addbutton: idOfButton => dispatch(addButton(idOfButton))
};
}
class Submit extends React.Component{
constructor(){
super();
this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
}
handleChange(event) {
this.setState({ [event.target.id]: event.target.value });
}
handleSubmit(event) {
event.preventDefault();
const {titleToBeAddedToList} = this.state;
const id = uuidv1();
const button_id = uuidv1();
//Dispatching the action:
this.props.addlist({ titleToBeAddedToList, id });
this.props.addbutton({id, button_id});
//Once we've dispatched an action, we want to clear the state:
this.setState({ titleToBeAddedToList: "" });
}
render() {
return (
<form onSubmit={this.handleSubmit}>
<div className="form-group">
<label htmlFor="title">Title</label>
<input
type="text"
className="form-control"
id="titleToBeAddedToList"
onChange={this.handleChange}
/>
</div>
<button type="submit" className="btn btn-success btn-lg">
SAVE
</button>
</form>
);
}
}
const SubmitButton = connect(null, mapDispatchToProps)(Submit)
export default SubmitButton;
Переходники:
const initialState = {
lists: [],
buttons: []
};
function rootReducer (state = initialState, action) {
if(action.type === "ADD_LIST" ){
return Object.assign({}, state, {
lists: state.lists.concat(action.payload)
});
} else if(action.type === "ADD_BUTTON"){
return Object.assign({}, state, {
buttons: state.lists.concat(action.payload)
});
} else if(action.type === "DELETE_FROM_LIST"){
//.....//
}
return state;
}
export default rootReducer;
Действие:
export function addList(payload) {
return { type: "ADD_LIST", payload }
};
export function addButton(payload){
return {type: "ADD_BUTTON", payload }
}
export function deleteList(payload){
return { type: "DELETE_FROM_LIST", payload }
}
Магазин:
import { createStore } from "redux";
import rootReducer from "../reducers/index";
const store = createStore(rootReducer);
export default store;