編輯:添加簡單的例子來綁定一個參數的動作功能。
我認爲這個問題有很多解決方案,但我會盡力描述我通常所做的事(書面代碼未經測試)。比方說,你有以下列表項組件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 })
}
}
使用此模式可以爲我們的列表創建一個通用結構。如果您發現此模式有用,並且您對我的當前解決方案有任何改進,請告知我們。您可以在設計容器時將參數綁定到點擊處理程序(在上面的示例中未示出)。
所以,答案是:1)還是應該爲每個路由嘗試創建一個動作? 2)實際上,你應該爲每個你想要訪問的URL創建一個特定的動作,而不是對任何URL進行通用的路由動作?如果是這樣的話:q1)你甚至會允許使用' Domi
不需要爲每個URL創建一個新的動作,depsMapper可以鏈接到任何你想要的動作。我通常把經常使用的動作放在一個名爲'shared.js'(或類似的東西)的文件中,並在整個模塊中使用它。所以'goto:actions.myList.goto'可以是例如:'goto:actions.shared.goto'。我現在看到,我的示例沒有演示如何將參數綁定到動作函數,我將用一個簡單示例進行更新。 –