Perguntas da entrevista do React Hook

O que são ganchos no React?

Ganchos são um novo recurso adicionado no React v16.8. Os ganchos permitem que você use todos os recursos do React sem escrever componentes de classe. Por exemplo, antes da versão 16.8, precisamos de um componente de classe para gerenciar o estado de um componente. Agora podemos salvar o estado em um componente funcional usando o gancho useState .





Os ganchos do React funcionarão dentro dos componentes da classe?

Não.





Por que os ganchos foram introduzidos no React?

Um dos motivos para a introdução de ganchos foi a dificuldade de trabalhar com a palavra-chave this dentro dos componentes da classe. Se não tratada adequadamente, esta terá um significado ligeiramente diferente. Isso quebrará strings como this.setState () e outros manipuladores de eventos. Ao usar ganchos, evitamos essa complexidade ao trabalhar com componentes funcionais.





Os componentes da classe não diminuem muito bem e também tornam o recarregamento a quente não confiável. Esta é outra razão para criar ganchos.





Outro motivo é que não há uma maneira específica de reutilizar a lógica de um componente com estado. Embora os modelos HOC (Componente de Ordem Superior) e Render Props (um método de passar adereços de pai para filho usando uma função ou encerramento) resolvam esse problema, o código do componente de classe precisa ser alterado aqui. Os ganchos permitem que você compartilhe lógica com estado sem alterar a hierarquia do componente.





, . , (fetch) componentDidMount() componentDidUpdate(). : componentDidMount() componentWillUnmount() . .





useState? ?

useState - , . 2 . - . - .





useState React





import React, {useState} from "react";
      
      



useState, :





const [currentStateValue, functionToUpdateState] = useState(initialStateValue);
      
      



useState

. , , .





class Counter extends Component {
    state = {
        count: 0,
    };

    incrementCount = () => {
        this.setState({
            count: this.state.count + 1,
        });
    };

    render() {
        return (
            <div>
            <button onClick={this.incrementCount}>Count: {this.state.count}</button>
        </div>
    	);
    }
}
      
      



, React.









import React, { useState } from "react";

function Counter() {
    const [count, setCount] = useState(0);

    return (
        <div>
            <button
                onClick={() => {
                    setCount(count + 1);
                }}
            >
                Count: {count}
            </button>
        </div>
    );
}
      
      



useState 2

. .





class Counter extends Component {
    state = { count: 0 };

    incrementCount = () => {
        this.setState((prevState) => {
            return {
                count: prevState.count + 1,
            };
        });
    };

    decrementCount = () => {
        this.setState((prevState) => {
            return {
                count: prevState.count - 1,
            };
        });
    };

    render() {
        return (
            <div>
                <strong>Count: {this.state.count}</strong>
                <button onClick={this.incrementCount}>Increment</button>
                <button onClick={this.decrementCount}>Decrement</button>
            </div>
        );
    }
}
      
      



, React.





.





, callback. callback- .





import React, { useState } from "react";

function Counter() {
    const [count, setCount] = useState(0);

    const incrementCount = () => {
        setCount((prevCount) => {
            return prevCount + 1;
        });
    };

    const decrementCount = () => {
        setCount((prevCount) => {
            return prevCount - 1;
        });
    };

    return (
        <div>
            <strong>Count: {count}</strong>
            <button onClick={incrementCount}>Increment</button>
            <button onClick={decrementCount}>Decrement</button>
        </div>
    );
}
      
      



useState 3

, , .





export class Profile extends Component {
    state = {
        name: "Backbencher",
        age: 23,
    };

    onNameChange = (e) => {
        this.setState({
            name: e.target.value,
        });
    };

    onAgeChange = (e) => {
        this.setState({
            age: e.target.value,
        });
    };

    render() {
        return (
            <div>
                <form>
                    <input
                        type="text"
                        value={this.state.name}
                        onChange={this.onNameChange}
                    />
                    <input
                        type="number"
                        value={this.state.age}
                        onChange={this.onAgeChange}
                    />
                    <h2>
                        Name: {this.state.name}, Age: {this.state.age}
                    </h2>
                </form>
            </div>
        );
    }
}
      
      



, React.









import React, { useState } from "react";

function Profile() {
    const [profile, setProfile] = useState({
        name: "Backbencher",
        age: 23,
    });

    const onNameChange = (e) => {
        setProfile({ ...profile, name: e.target.value });
    };

    const onAgeChange = (e) => {
        setProfile({ ...profile, age: e.target.value });
    };

    return (
        <div>
            <form>
                <input type="text" value={profile.name} onChange={onNameChange} />
                <input type="text" value={profile.age} onChange={onAgeChange} />
                <h2>
                    Name: {profile.name}, Age: {profile.age}
                </h2>
            </form>
        </div>
    );
}
      
      



useState() , . setState() .





spread JavaScript.





?

setState() . , , , , , .





, setState() . useState() spread .





useEffect?

useEffect . . .





useEffect

, Boom , .





export class Banner extends Component {
    state = {
        count: 0,
    };

    updateState = () => {
        this.setState({
            count: this.state.count + 1,
        });
    };

    componentDidMount() {
        console.log("Boom");
    }

    componentDidUpdate() {
        console.log("Boom");
    }

    render() {
        return (
            <div>
                <button onClick={this.updateState}>State: {this.state.count}</button>
            </div>
        );
    }
}
      
      



console.log React.





.





componentDidMount() componentDidUpdate() - . useEffect. useEffect - , callback. callback , .





:





import React, { useState, useEffect } from "react";

function Banner() {
    const [count, setCount] = useState(0);

    useEffect(() => {
        console.log("Boom");
    });

    const updateState = () => {
        setCount(count + 1);
    };

    return (
        <div>
            <button onClick={updateState}>State: {count}</button>
        </div>
    );
}
      
      



useEffect 2

:





function Banner() {
    const [count, setCount] = useState(0);
    const [name, setName] = useState("");

    useEffect(() => {
        console.log(" ");
    });

    return (
        <div>
            <button onClick={() => setCount(count + 1)}>State: {count}</button>
            <input
                type="text"
                value={name}
                onChange={(e) => setName(e.target.value)}
            />
        </div>
    );
}
      
      



« » . ?





.





useEffect , . props , . , , , . count .





useEffect:





useEffect(() => {
    console.log("Count is updated");
}, [count]);
      
      



useEffect 3

, . componentDidMount() .





export class Clock extends Component {
    state = {
        date: new Date(),
    };

    componentDidMount() {
        setInterval(() => {
            this.setState({
                date: new Date(),
            });
        }, 1000);
    }

    render() {
        return <div>{this.state.date.toString()}</div>;
    }
}
      
      



React.





.





componentDidMount() - , . useEffect, componentDidMount(). useEffect props . , - useState. . , React props, . , useEffect , componentDidMount().





React.





function Clock() {
    const [date, setDate] = useState(new Date());

    useEffect(() => {
        setInterval(() => {
            setDate(new Date());
        }, 1000);
    }, []);

    return <div>{date.toString()}</div>;
}
      
      



useEffect 4

, .





componentDidMount() {
    window.addEventListener("mousemove", this.handleMousePosition);
}

componentWillUnmount() {
    window.removeEventListener("mousemove", this.handleMousePosition);
}
      
      



Reescreva este código no estilo dos ganchos React.





Decisão.





Para usar a funcionalidade do método de ciclo de vida componentWillUnmount () no gancho useEffect, você precisa retornar um retorno de chamada com o código que precisa ser executado quando o componente é desmontado.





useEffect(() => {
    window.addEventListener("mousemove", handleMousePosition);

    return () => {
        window.removeEventListener("mousemove", handleMousePosition);
    }
}, []);
      
      



A tarefa useContext

Aqui está um trecho de código do componente Context.Consumer.





import { NameContext, AgeContext } from "./ProviderComponent";

export class ConsumerComponent extends Component {
    render() {
        return (
            <NameContext.Consumer>
                {(name) => {
                    return (
                        <AgeContext.Consumer>
                            {(age) => (
                                <div>
                                    Name: {name}, Age: {age}
                                </div>
                            )}
                        </AgeContext.Consumer>
                    );
                }}
            </NameContext.Consumer>
        );
    }
}
      
      



Reescreva o ConsumerComponent  usando o gancho  useContext .





Solução .





Os ganchos só podem ser usados ​​em um componente funcional.





ConsumerComponent pode ser reescrito assim:





function ConsumerComponent() {
    const name = useContext(NameContext);
    const age = useContext(AgeContext);

    return (
        <div>
            Name: {name}, Age: {age}
        </div>
    );
}
      
      










All Articles