* chore: rename APIs and Microservices to include "Backend" (#42515) * fix typo * fix typo * undo change * Corrected grammar mistake Corrected a grammar mistake by removing a comma. * change APIs and Microservices cert title * update title * Change APIs and Microservices certi title * Update translations.json * update title * feat(curriculum): rename apis and microservices cert * rename folder structure * rename certificate * rename learn Markdown * apis-and-microservices -> back-end-development-and-apis * update backend meta * update i18n langs and cypress test Co-authored-by: Shaun Hamilton <shauhami020@gmail.com> * fix: add development to front-end libraries (#42512) * fix: added-the-word-Development-to-front-end-libraries * fix/added-the-word-Development-to-front-end-libraries * fix/added-word-development-to-front-end-libraries-in-other-related-files * fix/added-the-word-Development-to-front-end-and-all-related-files * fix/removed-typos-from-last-commit-in-index.md * fix/reverted-changes-that-i-made-to-dependecies * fix/removed xvfg * fix/reverted changes that i made to package.json * remove unwanted changes * front-end-development-libraries changes * rename backend certSlug and README * update i18n folder names and keys * test: add legacy path redirect tests This uses serve.json from the client-config repo, since we currently use that in production * fix: create public dir before moving serve.json * fix: add missing script * refactor: collect redirect tests * test: convert to cy.location for stricter tests * rename certificate folder to 00-certificates * change crowdin config to recognise new certificates location * allow translations to be used Co-authored-by: Nicholas Carrigan (he/him) <nhcarrigan@gmail.com> * add forwards slashes to path redirects * fix cypress path tests again * plese cypress * fix: test different challenge Okay so I literally have no idea why this one particular challenge fails in Cypress Firefox ONLY. Tom and I paired and spun a full build instance and confirmed in Firefox the page loads and redirects as expected. Changing to another bootstrap challenge passes Cypress firefox locally. Absolutely boggled by this. AAAAAAAAAAAAAAA * fix: separate the test Okay apparently the test does not work unless we separate it into a different `it` statement. >:( >:( >:( >:( Co-authored-by: Sujal Gupta <55016909+heysujal@users.noreply.github.com> Co-authored-by: Noor Fakhry <65724923+NoorFakhry@users.noreply.github.com> Co-authored-by: Oliver Eyton-Williams <ojeytonwilliams@gmail.com> Co-authored-by: Nicholas Carrigan (he/him) <nhcarrigan@gmail.com>
4.6 KiB
id, title, challengeType, forumTopicId, dashedName
id | title | challengeType | forumTopicId | dashedName |
---|---|---|---|---|
5a24c314108439a4d4036174 | Vincular 'this' para um método de classe | 6 | 301379 | bind-this-to-a-class-method |
--description--
Além de definir e atualizar state
, você também pode definir métodos para o seu componente de classe. Um método de classe tipicamente precisa usar a palavra-chave this
para que possa acessar as propriedades na classe (assim como state
e props
) dentro do escopo do método. Existem algumas maneiras para permitir que os métodos da sua classe acessem this
.
Uma forma comum é explicitamente vincular this
no construtor para que this
torne-se vinculado aos métodos da classe quando o componente é inicializado. Você pode ter percebido que o último desafio usou this.handleClick = this.handleClick.bind(this)
para o método handleClick
no construtor. Em seguida, quando você chama uma função como this.setState()
dentro do método da classe, this
refere-se a classe e não será undefined
.
Observação: a palavra-chave this
é um dos aspectos mais confusos do JavaScript mas ele exerce uma papel importante em React. Embora o seu comportamento aqui é completamente normal, essas aulas não são o lugar para uma análise profunda de this
portanto, por favor consulte outras aulas se o conteúdo acima for confuso!
--instructions--
O editor de código possui um componente com um state
que mantém o controle do texto. Também possui um método o qual o permite definir o texto para You clicked!
. No entanto, o método não funciona porque está usando a palavra-chave this
que é undefined. Corrija isso ao vincular explicitamente this
ao método handleClick()
no construtor do componente.
Em seguida, adicione um manipulador de clique ao elemento button
no método de renderização. Ele deve acionar o método handleClick()
quando o botão recebe um evento de clique. Lembre-se de que o método que você passou ao manipulador onClick
precisa de chaves porque ele deve ser interpretado diretamente como JavaScript.
Assim que você completar os passos acima você deve ser capaz de clicar o botão e ver You clicked!
.
--hints--
MyComponent
deve retornar um elemento div
o qual envolve dois elementos, os elementos button
e h1
, nessa ordem.
assert(
Enzyme.mount(React.createElement(MyComponent)).find('div').length === 1 &&
Enzyme.mount(React.createElement(MyComponent))
.find('div')
.childAt(0)
.type() === 'button' &&
Enzyme.mount(React.createElement(MyComponent))
.find('div')
.childAt(1)
.type() === 'h1'
);
O state de MyComponent
deve inicializar com o par de chave e valor { text: "Hello" }
.
assert(
Enzyme.mount(React.createElement(MyComponent)).state('text') === 'Hello'
);
Clicar o elemento button
deve executar o método handleClick
e definir o estado de text
para You clicked!
.
async () => {
const waitForIt = (fn) =>
new Promise((resolve, reject) => setTimeout(() => resolve(fn()), 250));
const mockedComponent = Enzyme.mount(React.createElement(MyComponent));
const first = () => {
mockedComponent.setState({ text: 'Hello' });
return waitForIt(() => mockedComponent.state('text'));
};
const second = () => {
mockedComponent.find('button').simulate('click');
return waitForIt(() => mockedComponent.state('text'));
};
const firstValue = await first();
const secondValue = await second();
assert(firstValue === 'Hello' && secondValue === 'You clicked!');
};
--seed--
--after-user-code--
ReactDOM.render(<MyComponent />, document.getElementById('root'))
--seed-contents--
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
text: "Hello"
};
// Change code below this line
// Change code above this line
}
handleClick() {
this.setState({
text: "You clicked!"
});
}
render() {
return (
<div>
{ /* Change code below this line */ }
<button>Click Me</button>
{ /* Change code above this line */ }
<h1>{this.state.text}</h1>
</div>
);
}
};
--solutions--
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
text: "Hello"
};
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
this.setState({
text: "You clicked!"
});
}
render() {
return (
<div>
<button onClick = {this.handleClick}>Click Me</button>
<h1>{this.state.text}</h1>
</div>
);
}
};