javascript - 如何决定何时传递参数以及何时不传递
问题描述
谁能告诉我我们如何知道何时需要传递参数以及何时不需要?例如,在下面的代码中click={() => this.deletePersonHandler(index)
,我没有传递任何参数并直接给出 index 参数,但代码仍在工作。另一方面,changed={(event) => this.nameChangedHandler(event, person.id)
我必须传递事件参数才能使代码正常工作。在这里,我对如何决定何时传递参数和何时不传递感到困惑。
import './App.css';
import Person from './Person/Person';
class App extends React.Component {
state = {
persons: [
{ id: 'user1', name: 'Royal1', age: 20},
{ id: 'user2', name: 'Royal2', age: 21},
{ id: 'user3', name: 'Royal3', age: 23}
],
other: 'some other value',
showPersons: false
}
nameChangedHandler = (event, id) => {
const personIndex = this.state.persons.findIndex(p => {
return p.id === id;
})
const person = {
...this.state.persons[personIndex]
}
person.name = event.target.value
const persons = [...this.state.persons]
persons[personIndex] = person
this.setState({ persons: persons})
}
deletePersonHandler = (personIndex) => {
const persons = [...this.state.persons];
persons.splice(personIndex, 1);
this.setState({persons: persons})
}
togglePersonsHandler = () => {
const doesShow = this.state.showPersons;
this.setState({showPersons: !doesShow});
}
render() {
const style = {
backgroundColor: 'pink',
font: 'inherit',
border: '1px solid blue',
cursor: 'pointer'
}
let persons = null;
if (this.state.showPersons) {
persons = <div>
{this.state.persons.map((person, index) => {
return <Person
click={() => this.deletePersonHandler(index)}
name={person.name}
age={person.age}
key={person.id}
changed={(event) => this.nameChangedHandler(event, person.id)} />
})}
</div>
}
return (
<div className="App">
<h1>Hi I am React App</h1>
<p>This is really working!</p>
<button style={style} onClick={this.togglePersonsHandler}>Switch Name</button>
{persons}
</div>
);
}
}
export default App;```
解决方案
无论你作为事件处理程序传递什么,都会被事件对象调用。想象以下情况:
const noParams = () => { ... };
onClick={noParams}
->noParams(event)
✅</p>onClick={() => noParams()}
->noParams()
✅</p>
const nonEventParams = (thing) => { ... };
onClick={noParams}
->nonEventParams(event)
❌</p>onClick={() => nonEventParams(thing)}
->nonEventParams(thing)
✅</p>
const usesEvent = (event) => { ... };
onClick={usesEvent}
->usesEvent(event)
✅</p>onClick={(event) => usesEvent(event)}
->usesEvent(event)
✅</p>
const mixedParams = (event, thing) => { ... }
onClick={mixedParams}
->mixedParams(event)
❌</p>onClick={(event) => mixedParams(event, thing)}
->mixedParams(event, thing)
✅</p>
如果你的回调不需要任何东西,或者只需要事件,你可以直接传递它。在所有其他情况下,您需要将代理事件的函数和任何其他参数传递给您的回调。
推荐阅读
- javascript - 如何将 uint64 值转换为 ArrayBuffers?我只在下面的链接中找到了反转:
- git - Git pull 不更新更改
- kubernetes - 当我使用秘密在 kubernetes 中部署 pod 时发现 CreateContainerConfigError
- svelte - 如何通过浏览器的控制台更改 Svelte 应用程序中的变量值
- javascript - 语义 UI 表中的可点击行返回错误
- javascript - 调用通用 HTTP 处理程序
- node.js - 如何在 MongoDB 的更新中使用算术运算符?
- python - 如何将变量与 broken_bath 图一起使用?
- xamarin.forms - 在媒体播放器中使用来自 android 项目的文件
- azerothcore - 如何在 AzerothCore 中通过补丁限制内容