【发布时间】:2017-06-03 10:37:51
【问题描述】:
有这个动作创建者:
export function selectBook(book) {
// selectBook is an ActionCreator, it needs to return an action,
// an object with a type property.
return {
type: 'BOOK_SELECTED',
payload: book,
};
}
有一个简单的减速器:
export default function() {
return [
{ title: 'Javascript: The Good Parts', pages: 101 },
{ title: 'Harry Potter', pages: 39 },
{ title: 'The Dark Tower', pages: 85 },
{ title: 'Eloquent Ruby', pages: 1 }
];
}
其余代码在这里: https://github.com/StephenGrider/ReduxCasts/tree/master/book_list/src
现在,我正在玩它并想返回例如。标题中的字符数,但首先我只想在动作创建器中提取标题并显示它。我已将动作创建者修改如下:
export function selectBook(book) {
// selectBook is an ActionCreator, it needs to return an action,
// an object with a type property.
let title = book.title;
console.log(title);
return {
type: 'BOOK_SELECTED',
payload: book,
count: title
};
}
之后,我将向“标题”添加方法——我现在只想从组件中访问它。上面的 console.log(title) 正确输出了标题。正如您从链接中看到的那样,它然后通过 mapStateToProps 然后
<div>Title: {this.props.book.title}</div>
<div>Pages: {this.props.book.pages}</div>
<div>Count: {this.props.book.count}</div>
根据原始代码,前两个输出正常。第三个,伯爵,没有。 {this.props.book.count} 输出空白。
对于多个标题的混淆,我们深表歉意。现在在“计数”下,我想输出标题。完成后,我将更改动作创建者以计算标题的字符数。
编辑:
// State argument is not application state, only the state
// this reducer is responsible for
export default function (state = null, action) {
switch (action.type) {
case 'BOOK_SELECTED':
return { action.payload, action.count };
}
return state;
}
我试过上面的,但是语法错误。
更多代码(reducers index):
import { combineReducers } from 'redux';
import BooksReducer from './reducer_books';
import ActiveBook from './reducer_active_book';
const rootReducer = combineReducers({
books: BooksReducer,
activeBook: ActiveBook
});
export default rootReducer;
带有 mapStateToProps 的容器:
import React, { Component } from 'react';
import { connect } from 'react-redux';
class BookDetail extends Component {
render() {
if (!this.props.book) {
return <div>Select a book to get started.</div>;
}
return (
<div>
<h3>Details for:</h3>
<div>Title: {this.props.book.title}</div>
<div>Pages: {this.props.book.pages}</div>
<div>Count: {this.props.book.count}</div>
</div>
);
}
}
function mapStateToProps(state) {
return {
book: state.activeBook
};
}
export default connect(mapStateToProps)(BookDetail);
【问题讨论】:
-
请分享您的
mapStateToProps,您可能没有正确设置状态。在上面的代码中,this.props.book.count没有任何价值,因为它是未定义的。 -
据我所知,您没有对减速器中 BOOK_SELECTED 的计数做任何事情。如果您不通过 reducer 使用 count 更新状态,您希望状态如何反映这一点?
-
谢谢。我添加了更多代码(mapStateToProps)。 Abihishek,你是对的,但我试图在 reducer 中返回 2 个元素,但出现语法错误。见上文。
-
在 reducer 中,您需要扩充状态对象以反映您发送的新负载。不确定您的要求是什么,但我想您只想在减速器中返回标题。
-
这是不合法的 js:
return { action.payload, action.count }。您需要为您的值添加键。只有名称与值完全相同的键才能使用此速记符号developer.mozilla.org/en/docs/Web/JavaScript/Reference/…