Почему функция onClick вызывается для Render в одной ситуации, а не в другой? - PullRequest
0 голосов
/ 10 апреля 2020

Описание того, что я построил: Добавление / удаление друзей из списка.

Обзор: У меня есть две ситуации, когда я передаю функцию через событие по нажатию.

Ситуация № 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> 

1 Ответ

1 голос
/ 10 апреля 2020

Вы только передаете функцию, чтобы вызвать ее, вам нужно сделать это:

this.handleAddFriend()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...