我一直在开发React应用程序,现在我需要Redux来处理它的某些方面。
阅读了一堆教程之后,我相当着迷于如何使“更智能”的组件“笨拙”以及如何将功能移入我的动作和化简器中。
因此,例如,应用程序的一个方面更多是待办事项列表样式。
我的课程之一是这样开始的:
export default class ItemList extends React.Component {
constructor() {
super();
this.state = { items: [],
completed: [],
};
this.addItem = this.addItem.bind(this);
this.completeItem = this.completeItem.bind(this);
this.deleteItem = this.deleteItem.bind(this);
}
addItem(e) {
var i = this.state.items;
i.push({
text: this._inputElement.value,
paused: false,
key: Date.now()
});
this.setState({ items: i });
e.preventDefault();
this._inputElement.value = '';
this._inputElement.focus();
}
completeItem(e) {
this.deleteItem(e);
var c = this.state.completed;
c.push({
text: e.target.parentNode.parentNode.getElementsByClassName('item-name')[0].innerHTML,
paused: false,
key: Date.now()
});
this.setState({ completed: c });
}
deleteItem(e) {
var i = this.state.items;
var result = i.filter(function(obj) {
return obj.text !== e.target.parentNode.parentNode.getElementsByClassName('item-name')[0].innerHTML;
});
this.setState({ items: result });
}
// ... more irrelevant code here ...
// there's a function called createTasks that renders individual items
render() {
var listItems = this.state.items.map(this.createTasks);
return <div className="item-list">
<form className="form" onSubmit={this.addItem}>
<input ref={(a) => this._inputElement = a}
placeholder="Add new item"
autoFocus />
<button type="submit"></button>
</form>
{listItems}
</div>;
}
}
因此,如您所见,这是非常繁重的逻辑。我已经开始通过<Provider>
在索引文件中添加来添加Redux
,并制作了一个基本的reducers文件,该文件到目前为止还很空:
import { combineReducers } from 'redux';
const itemList = (state = {}, action) => {
};
// ... other irrelevant reducers
const rootReducer = combineReducers({
itemList,
// ...
});
export default rootReducer;
…而且我制作的动作文件也没有太多内容。
我一直在努力找出:
首先,您需要了解redux如何与react结合使用。
在开始之前,首先要了解什么是智能组件和哑组件。
智能组件
哑巴组件
这是一篇很棒的文章,如果您仍有疑问,可以通过这篇文章来了解智能和愚蠢的组件。
好的,现在让我们尝试了解redux的工作原理:-
现在让我们考虑您的待办事项示例
TodoListContainer.js
class TodoListContainer extends Component {
componentWillMount () {
// fire you action action
}
render () {
return (
<Todos todos=={this.props.todos} />
)
}
}
function mapStateToProps(state) {
const {todos} = state;
return {
todos;
}
}
export default connect(mapStateToProps)(TodoListContainer)
TodoList.js
class TodoList extends Component {
renderTodos() {
return this.props.todos.map((todo)=>{
return <Todo todo={todo} key={todo.id} />
})
}
render () {
return () {
if (this.props.todos.length === 0) {
return <div>No todos</div>
}
return (
<div>
{this.renderTodos()}
</div>
)
}
}
}
export default class TodoList
Todo.js
class Todo extends Component {
render () {
return (
<div>
<span>{this.props.todo.id}</span>
<span>{this.props.todo.name}</span>
</div>
)
}
}
减速器
export default function todos(state={},action) {
switch (action.type) {
case 'RECEIVE_TODOS':
return Object.assign(state,action.todos);
}
}
行动
function fetchTodos() {
return(dispatch) => {
axios.get({
//api details
})
.then((res)=>{
dispatch(receiveTodos(res.todos))
})
.catch((err)=>{
console.warn(err)
})
}
}
function receiveTodos(todos) {
return {
type: 'RECEIVE_TODOS',
todos
}
}
现在,如果您已阅读redux文档,您将看到动作返回对象,那么我将如何在其中调用返回函数而不是对象的api。为此,我使用了redux
thunk,您可以在此处阅读有关内容。
我为您提供了一个示例,您可以在其中获取待办事项。如果要执行其他操作,例如deleteTodo,addTodo,modifyTodo,则可以在适当的组件中执行此操作。
您也可以在此处查看详细示例,但在此之前,我想说的是应该先了解redux的基础知识,您可以在此处找到
PS:我是即时编写代码的,因此它可能无法正常工作,但应稍作修改即可工作。
问题内容: 我目前正在学习React,并且试图弄清楚如何与Redux一起使用它来构建移动应用程序。我对两者如何关联/一起使用感到困惑。例如,我在React https://www.raywenderlich.com/99473/introducing-react-native-building-apps- javascript中 完成了本教程,但现在我想尝试在该应用中添加一些reducers /
通过执行,我创建了一个react native应用程序。 然后,我按照这里的说明,向它添加react-nate-web。 我还添加了一个我的应用程序根文件夹下的文件。以下是该文件的外观: 这是我的文件: 下面是我在文件: 但是,当我尝试使用下面的命令运行此命令时,我得到以下错误。 错误: 错误/指数网状物js模块构建失败(来自./node_modules/babel loader/lib/inde
我使用React-Router 1.0.0-rc3和Redux-Router 1.0.0-beta3。 在这种情况下,我们如何使用?
我很难知道如何将我的JFXPanel(它是一个mp3播放器)集成到一个现有的Swing应用程序中,该应用程序是一个JFrame,其中添加了几个不同的JPanel。我对JavaFX是一个完全的noob,它与Swing非常不同。 我能够得到下面的代码来运行和做我想做的事情。它将播放mp3文件从一个目录,我有他们包含在。这是某人编写的示例中的代码。我的问题是,这段代码创建了JFrame,有main方法和
我已在项目文件夹中安装了模块: ####################################################################################################### NPM警告可选跳过可选依赖性:fsevents@1.2.7(node_modules/fsecents): NPM警告不支持跳过选项依赖性:不支持fsevent
我有一个工作应用程序,我想添加语音命令。当前应用程序定期(定时器)通过蓝牙来回传输数据。用户可以按按钮和NumberPickers来修改通过蓝牙发送的数据。还有从蓝牙链接接收到的数据,并显示在文本视图中。此应用程序目前工作正常。 我想做的是添加语音命令功能,以便用户可以选择按下按钮/数字选择器,或者可以仅使用语音命令更改值。 我测试了一些可以在各种网站上找到的从语音到文本的例子。我成功地测试了一个