编辑:添加了将单个参数绑定到操作函数的简单示例。
我认为这个问题有很多解决方案,但我会尝试描述我通常做的事情(编写的代码未经测试)。假设您有以下列表项组件components/list_item.js
:
import React from 'react';
class ListItem extends React.Component {
render() {
const { clickHandler, label } = this.props;
return <li onClick={clickHandler}>{label}</li>;
}
}
// add default props and propTypes here...
export ListItem;
和一个列表包装组件components/list.js
:
import React from 'react';
import ListItem from './list_item.js';
class List extends React.Component {
renderItem({ clickHandler, label, arg }) {
return <ListItem clickHandler={arg ? this.props[clickHandler].bind(this, arg) : this.props[clickHandler]} label={label} />;
}
renderList() {
const { items } = this.props;
return items.map((item) => {
return renderItem(item);
});
}
render() {
return <ul>{this.renderList()}</ul>;
}
}
// add default props and propTypes here...
export List;
如果我想创建一个新列表,我只需创建一个新容器,如下所示containers/my_list.js
:
import List from '../components/list';
import {useDeps, composeWithTracker, composeAll} from 'mantra-core';
export const composer = ({}, onData) => {
const items = [
{
clickHandler: 'goto',
label: 'Goto document',
arg: 'MyRoute'
},
{
clickHandler: 'remove',
label: 'Remove document'
}
];
onData(null, {items});
};
export const depsMapper = (context, actions) => ({
goto: actions.myList.goto,
remove: actions.myList.remove,
context: () => context
});
export default composeAll(
composeWithTracker(composer),
useDeps(depsMapper)
)(List);
例如,此容器链接到以下操作actions/my_list.js
:
export default {
goto({ FlowRouter }, route) {
FlowRouter.go(route);
},
remove({ Collections }, _id) {
Collections.Documents.remove({ _id })
}
}
使用这种模式创建我们列表的通用结构。如果您发现此模式有用,以及您对我当前的解决方案是否有任何改进,请告诉我。您也可以在设计容器时将参数绑定到单击处理程序(上例中未说明)。