Я пытаюсь обновить свои данные в редуксе, но получаю сообщение об ошибке, когда у меня есть более одного значения в состоянии.
Как я передаю данные в компонент AllPalletes ниже:
<Route exact path='/' render = {(routeProps) => <AllPalletes data = {this.props.palleteNames} />} />
Компонент AllPalletes, где я настраиваю форму редактирования:
class connectingPalletes extends Component {
render () {
console.info(this.props)
return (
<div>
<Menu inverted>
<Menu.Item header>Home</Menu.Item>
<Menu.Item as = {Link} to = '/createpalette'>Create a Palette</Menu.Item>
</Menu>
<Container>
<Card.Group itemsPerRow = {4}>
{this.props.data.map((card) => {
let cardName = card.Name.replace(/\s+/g, '-').toLowerCase()
return (
<Card key = {card._id}>
<Image src = 'https://images.pexels.com/photos/1212406/pexels-photo-1212406.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=500' wrapped ui = {false}/>
<Card.Content>
<Grid>
<Grid.Column floated = 'left' width = {7}>
{card.edit? (
<PaletteEditForm {...card}/>
) : (
<Card.Header as = {Link} to = {`/palette/${cardName}`}>{card.Name}</Card.Header>
)}
</Grid.Column>
<Grid.Column floated = 'right' width = {5}>
<Icon name = 'pencil' />
<Icon name = 'trash' onClick = {() => this.props.dispatch(removePalette({id: card._id}))}/>
</Grid.Column>
</Grid>
</Card.Content>
</Card>
)
})}
</Card.Group>
<Divider></Divider>
<Divider hidden></Divider>
<Grid centered columns = {1}>
<Button as = {Link} to = '/testing'>Go Back</Button>
</Grid>
</Container>
</div>
)
}
}
const AllPalletes = connect()(connectingPalletes)
export default AllPalletes
А вот форма редактирования:
class EditForm extends Component {
constructor(props) {
super(props)
this.state = {
paletteName: this.props.Name
}
}
handleChangeEvent = (e) => {
const val = e.target.value,
s_name = e.target.name
this.setState (() => {
return {
[s_name]: val,
}
})
}
handleSubmit = () => {
let updates = {Name: this.state.paletteName, edit: false}
this.props.dispatch(editPalette(this.props._id, updates))
}
render() {
console.info(this.props)
return (
<Form onSubmit = {this.handleSubmit}>
<Input type = 'text' name = 'paletteName' value = {this.state.paletteName} onChange = {this.handleChangeEvent} />
</Form>
)
}
}
const PaletteEditForm = connect()(EditForm)
export default PaletteEditForm
Мой Редуктор:
import uuid from 'uuid/v1'
const paletteDefault = [{
Name: "Material UI",
myArray: [],
_id: uuid(),
edit: false
}, {
Name: "Splash UI",
myArray: [],
_id: uuid(),
edit: true
}]
const PaletteReducers = (state = paletteDefault, action) => {
console.info(action)
switch(action.type) {
case 'ADD_PALETTE':
return [...state, action.palette]
case 'REMOVE_PALETTE':
return state.filter(x => x._id !== action.id)
case 'EDIT_PALETTE':
return state.map((palette) => {
if (palette._id === action.id) {
return {
...palette,
...action.updates
}
}
})
default:
return state
}
}
export default PaletteReducers
My Action
// EDIT_PALETTE
const editPalette = (id, updates) => ({
type: 'EDIT_PALETTE',
id,
updates
})
export {addPalette, removePalette, editPalette}
У меня есть ощущение, что проблема может быть в том, как я настроил корпус редуктора.
Отправка редактирования работает только тогда, когда у меня есть одно значение в состоянии. В противном случае я получаю эту ошибку:
Uncaught TypeError: Cannot read property 'Name' of undefined
at AllPalletes.js:23
Пожалуйста помоги..





Я нашел ошибку. Я не дал возвращаемое значение в случае «EDIT_PALETTE» после оператора if. Это было
case 'EDIT_PALETTE':
return state.map((palette) => {
if (palette._id === action.id) {
return {
...palette,
...action.updates
}
}
})
А вместо этого должно быть:
case 'EDIT_PALETTE':
return state.map((palette) => {
if (palette._id === action.id) {
return {
...palette,
...action.updates
}
}
return palette
})