5.4 KiB
5.4 KiB
id | title | challengeType | isRequired | videoUrl | localeTitle |
---|---|---|---|---|---|
5a24c314108439a4d4036173 | Set State with this.setState | 6 | false | Definir estado com this.setState |
Description
state
componente e como inicializar o estado no constructor
. Há também uma maneira de alterar o state
do componente. React fornece um método para atualizar o state
componente chamado setState
. Você chama o método setState
dentro de sua classe de componentes da seguinte forma: this.setState()
, passando um objeto com pares de valor-chave. As chaves são suas propriedades de estado e os valores são os dados de estado atualizados. Por exemplo, se estivéssemos armazenando um username
no estado e queríamos atualizá-lo, ficaria assim: this.setState ({React espera que você nunca modifique o
nome de usuário: 'Lewis'
});
state
diretamente, em vez disso, sempre use this.setState()
quando ocorrerem mudanças de estado. Além disso, você deve observar que o React pode agrupar várias atualizações de estado para melhorar o desempenho. O que isto significa é que as atualizações de estado através do método setState
podem ser assíncronas. Há uma sintaxe alternativa para o método setState
, que fornece uma maneira de contornar esse problema. Isso raramente é necessário, mas é bom manter isso em mente! Por favor, consulte a documentação do React para mais detalhes. Instructions
button
no editor de código que possui um manipulador onClick()
. Esse manipulador é acionado quando o button
recebe um evento de clique no navegador e executa o método handleClick
definido no MyComponent
. No método handleClick
, atualize o state
do componente usando this.setState()
. Defina a propriedade name
no state
para igualar a string React Rocks!
. Clique no botão e veja a atualização do estado renderizado. Não se preocupe se você não entender completamente como o código do manipulador de cliques funciona neste momento. Está coberto nos próximos desafios. Tests
tests:
- text: 'O estado de <code>MyComponent</code> deve ser inicializado com o par de valores de chave <code>{ name: Initial State }</code> .'
testString: 'assert(Enzyme.mount(React.createElement(MyComponent)).state("name") === "Initial State", "The state of <code>MyComponent</code> should initialize with the key value pair <code>{ name: Initial State }</code>.");'
- text: <code>MyComponent</code> deve renderizar um cabeçalho <code>h1</code> .
testString: 'assert(Enzyme.mount(React.createElement(MyComponent)).find("h1").length === 1, "<code>MyComponent</code> should render an <code>h1</code> header.");'
- text: O cabeçalho <code>h1</code> renderizado deve conter texto renderizado a partir do estado do componente.
testString: 'async () => { const waitForIt = (fn) => new Promise((resolve, reject) => setTimeout(() => resolve(fn()), 250)); const mockedComponent = Enzyme.mount(React.createElement(MyComponent)); const first = () => { mockedComponent.setState({ name: "TestName" }); return waitForIt(() => mockedComponent.html()); }; const firstValue = await first(); assert(/<h1>TestName<\/h1>/.test(firstValue), "The rendered <code>h1</code> header should contain text rendered from the component's state."); };'
- text: Chamar o método <code>handleClick</code> no <code>MyComponent</code> deve definir a propriedade name no estado para igualar <code>React Rocks!</code> .
testString: 'async () => { const waitForIt = (fn) => new Promise((resolve, reject) => setTimeout(() => resolve(fn()), 250)); const mockedComponent = Enzyme.mount(React.createElement(MyComponent)); const first = () => { mockedComponent.setState({ name: "Before" }); return waitForIt(() => mockedComponent.state("name")); }; const second = () => { mockedComponent.instance().handleClick(); return waitForIt(() => mockedComponent.state("name")); }; const firstValue = await first(); const secondValue = await second(); assert(firstValue === "Before" && secondValue === "React Rocks!", "Calling the <code>handleClick</code> method on <code>MyComponent</code> should set the name property in state to equal <code>React Rocks!</code>."); };'
Challenge Seed
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
name: 'Initial State'
};
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
// change code below this line
// change code above this line
}
render() {
return (
<div>
<button onClick={this.handleClick}>Click Me</button>
<h1>{this.state.name}</h1>
</div>
);
}
};
After Test
console.info('after the test');
Solution
// solution required