Описание того, что я построил: Добавление / удаление друзей из списка.
Обзор: У меня есть две ситуации, когда я передаю функцию через событие по нажатию.
Ситуация № 1: <button onClick = {this.handleAddFriend}>Submit</button>
Ситуация № 2: <button onClick={() => props.onRemoveFriend(name)}>Remove</button>
Анализ: Этот код работает, как и ожидалось. Однако у меня сложилось впечатление, что "если вы просто вызовете метод, как показано в ситуации № 1, то при рендеринге React будет немедленно вызовите эту функцию. (Использование анонимной функции - один из способов предотвратить это) "
Мой вопрос: Почему не Ситуация # 1 нарушить мой код, учитывая мое понимание сверху?
Вот мой полный код:
<!DOCTYPE html>
<html>
<head>
<title> First React App</title>
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
<body>
<div id = 'app'></div>
<script type = 'text/babel'>
//Function Component: Does not manage it's own state
function FriendsList(props) {
return (
<ul>
{props.list.map((name) => (
<li key = {name}>
<span>{name}</span>
<button onClick={() => props.onRemoveFriend(name)}>Remove</button>
</li>
))}
</ul>
)
}
//Class Component: Manages it's own state
class App extends React.Component {
constructor(props) {
//Invokes the constructor for the React Component Class(parent-class)
super(props);
//state now lives within the component
this.state = {
friends: ['Jordyn', 'Mikenzi', 'Jake'],
input: ''
}
// "this" refers to an instance of the "App" component.
console.log(this)
//You are "binding"/referencing the following method to "this" instance
this.handleRemoveFriend = this.handleRemoveFriend.bind(this);
this.handleAddFriend = this.handleAddFriend.bind(this);
this.updateInput = this.updateInput.bind(this);
}
handleAddFriend() {
this.setState((currentState) => {
return {
friends: currentState.friends.concat([this.state.input]),
input: ''
}
})
}
handleRemoveFriend(name) {
this.setState((currentState) => {
return {
friends: currentState.friends.filter((friend) => friend !== name)
}
})
}
updateInput(e) {
const value = e.target.value;
this.setState({
input: value
})
}
render() {
return (
<div>
<input type = 'text'
placeholder = 'Type a new friend here!'
value = {this.state.input}
onChange = {this.updateInput}
/>
<button onClick = {this.handleAddFriend}>Submit</button>
<FriendsList
list = {this.state.friends}
onRemoveFriend = {this.handleRemoveFriend}>
</FriendsList>
</div>
)
}
}
ReactDOM.render(
<App />,
document.getElementById('app')
);
</script>
</body>