- 只允許兩種形式
onClick={fn};
或
onClick={()=>{fn()}};
//onClick={()=>{fn(id)}};
- 不能這么寫
onClick={fn(id)};
- 此外
onClick={()=>{fn()}};
等效于
onClick={fn};
- 第1種寫法(由父組件dispatch,參數(shù)不流入TodoItem)
TodoList
todos.map((item) => (
<TodoItem
......
onToggle={() => onToggleTodo(item.id)}
onRemove={() => onRemoveTodo(item.id)}
/>
))
......
const mapDispatchToProps = (dispatch) => {
return {
onToggleTodo: (id) => {
dispatch(toggleTodo(id));
},
onRemoveTodo: (id) => {
dispatch(removeTodo(id));
}
};
};
TodoItem
<input ... onClick={() => {onToggle()}} />
<button ... onClick={()=>{onRemove()}}>×</button>
//這么寫很蠢
或
<input ... onClick={onToggle} />
<button ... onClick={onRemove}>×</button>
或
<input ... onClick={onToggle} />
<button ... onClick={onRemove}>×</button>
......
const mapDispatchToProps = (dispatch,ownProps) => {
return {
onToggle:()=>{
ownProps.onToggle();
},
onRemove:()=>{
ownProps.onRemove();
}
};
};
- 第2種寫法(由父組件dispatch,參數(shù)流入TodoItem)
TodoList
todos.map((item) => (
<TodoItem
......
id={item.id}
onToggle={onToggleTodo}
onRemove={onRemoveTodo}
/>
))
......
const mapDispatchToProps = (dispatch) => {
return {
onToggleTodo: (id) => {
dispatch(toggleTodo(id));
},
onRemoveTodo: (id) => {
dispatch(removeTodo(id));
}
};
};
TodoItem
<input ... onClick={() => {onToggle(id)}} />
<button ... onClick={()=>{onRemove(id)}}>×</button>
或
<input ... onClick={onToggle} />
<button ... onClick={onRemove}>×</button>
.........
const mapDispatchToProps = (dispatch,ownProps) => {
return {
onToggle:()=>{
ownProps.onToggle(ownProps.id);
},
onRemove:()=>{
ownProps.onRemove(ownProps.id);
}
};
};
- 第3種寫法(由子組件dispatch,參數(shù)不流入TodoItem)
這是不可能的
- 第4種寫法(由子組件dispatch,參數(shù)流入TodoItem)
TodoList
TodoItem
<input ... onClick={onToggle} />
<button ... onClick={onRemove}>×</button>
......
const mapDispatchToProps = (dispatch,ownProps) => {
return {
onToggle: () => {
dispatch(toggleTodo(ownProps.id));
},
onRemove: () => {
dispatch(removeTodo(ownProps.id));
}
};
};