Minden, amit tudnod kell a reakcióról: Az építkezés megkezdésének alapjai

Kíváncsi a Reactre, és még nem volt alkalma megtanulni? Vagy talán már korábban is kipróbált oktatóanyagokat, de küzdött az alapvető koncepciók elsajátításáért? Vagy talán megtanulta az alapokat, de szeretné megerősíteni tudását? Akárhogy is, ez a cikk az Ön számára készült.

Építünk egy egyszerű React zenelejátszót, amely az új React koncepciókra épül.

A következőket ismertetjük:

  • Mi a React komponens?
  • ReactDOM megjelenítés
  • Osztály vs funkcionális komponensek
  • JSX
  • Állapot
  • Eseménykezelés
  • Aszinkron setState
  • Kellékek
  • Refs

Ez szinte minden, ami a React alkalmazás felépítéséhez és fenntartásához szükséges. De darabonként bemutatjuk.

Beállít

Itt a helyzet: egy kis induló vállalkozás fordult hozzád segítségedért. Létrehoztak egy oldalt a felhasználók számára, hogy feltöltsék a zenét, és azt izzó színben jelenítsék meg. De nekik szükségük van rád a nehéz részre - az AKA-ra, hogy működjön.

A kezdéshez készítsen egy új projektkönyvtárat, és adja hozzá a következő három fájlt.

Győződjön meg róla, hogy a Chrome naprakész verzióját használja ezzel az oktatóanyaggal, különben a fenti kódban szereplő animációk nem fognak működni.

Köszönet Steven Fabrének a CSS lejátszási gombért és Justin Windle-nek a megjelenítési kódért (itt megtekintheti az eredetit).

Nyissa meg index.htmlmind a kódszerkesztőt, mind a böngészőt, és kezdjük!

Mi a React?

A React a felhasználói felületek kiépítésének egyik módja. Csak azzal foglalkozik, amit a kezelőfelületen lát. A React nagyon egyszerűvé teszi a felhasználói felületek felépítését azáltal, hogy minden oldalt darabokra vág. Komponenseknek nevezzük ezeket a darabokat .

Íme egy példa az oldal összetevőkre történő feldarabolására:

Minden fent kiemelt szakasz komponensnek számít. De mit jelent ez egy fejlesztő számára?

Mi az a React komponens?

A React komponens egy kis kód, amely az oldal egy részét képviseli. Mindegyik összetevő egy JavaScript függvény, amely egy olyan kódrészletet ad vissza, amely a weboldal egy részét reprezentálja.

Egy oldal elkészítéséhez ezeket a függvényeket bizonyos sorrendben hívjuk meg, összeállítjuk az eredményt és megmutatjuk a felhasználónak.

Írjunk egy komponenst a pt> t ag in index.html wit h the ty pe of “text/babel”:

 function OurFirstComponent() { return ( // Code that represents the UI element goes here ); }

When we call the OurFirstcomponent() function, we will get back a piece of the page.

You can also write functions like this:

const OurFirstComponent = () => { return ( // Stuff to make this component goes here );}

React uses a language called JSX that looks like HTML but works inside JavaScript, which HTML usually doesn’t do.

You can add plain HTML to this section to make it appear on the UI:

 function OurFirstComponent() { return ( 

Hello, I am a React Component!

); }

When we call the OurFirstComponent() function, we get back a bit of JSX. We can use something called ReactDOM to put it on the page.

 function OurFirstComponent() { return ( 

Hello, I am a React Component!

); }
 const placeWeWantToPutComponent = document.getElementById('hook'); ReactDOM.render(OurFirstComponent(), placeWeWantToPutComponent);

Now our <h1> tag will be put inside the element with the ID of hook. It should look like this when you refresh your browser:

We can also write our component in JSX like so:

ReactDOM.render(, placeWeWantToPutComponent);

This is standard — invoke your components like you are writing HTML.

Putting Components Together

We can put React components inside other components.

 function OurFirstComponent() { return ( 

I am the child!

); }
 function Container() { return ( 

I am the parent!

); }
 const placeWeWantToPutComponent = document.getElementById('hook'); ReactDOM.render(, placeWeWantToPutComponent);

This is how we build our page out of pieces of React — by nesting components inside of each other.

Class Components

So far, we’ve been writing components as functions. These are called functional components.

But you can write components another way, as JavaScript classes. These are called class components.

class Container extends React.Component { render() { return ( 

I am the parent!

); }}
const placeWeWantToPutComponent = document.getElementById('hook');ReactDOM.render(, placeWeWantToPutComponent);

Class components must have a function called render(). The render function returns the JSX of the component. They can be used the same way as functional components, like this: />.

You should use functional components over class components because they’re easier to read, unless you need component state (more on that soon).

JavaScript in JSX

You can put JavaScript variables inside of your JSX like this:

class Container extends React.Component { render() { const greeting = 'I am a string!'; return ( 

{ greeting }

); }}

Now the ‘I am a string!’ will be inside the h1.

You can also do more difficult stuff, like call a function:

class Container extends React.Component { render() { const addNumbers = (num1, num2) => { return num1 + num2; }; return ( 

The sum is: { addNumbers(1, 2) }

); }}

JSX Gotchas

Rename OurFirstComponent() to PlayButton. We want it to return the following:

But there’s a problem: class is a keyword in JavaScript, so we can’t use it. So how do we give our <;a> a class of play?

Use a property called className instead:

 function PlayButton() { return ; }
 class Container extends React.Component { render() { return ( ); } }
 const placeWeWantToPutComponent = document.getElementById('hook'); ReactDOM.render(, placeWeWantToPutComponent);

What Is This Component Doing?

Class components can store information about their current situation. This information is called state, which is stored in a JavaScript object.

In the code below, we have an object representing our components state. It has a key of isMusicPlaying which has a value of false. This object is assigned to this.state in the constructor method, which is called when the class is first used.

class Container extends React.Component { constructor(props) { super(props); this.state = { isMusicPlaying: false }; } render() { return ( ); }}

A constructor method of a React component always needs to call super(props) before anything else.

Okay, so what do we do with state? Why does it exist?

Changing Our React Component Based On State

State is way to update our UI based on events.

In this tutorial, we will use state to change the play button from paused to playing based on the user clicking the play button.

When the user clicks on the button, the state will update, which will then update the UI.

Here’s how we get started. We can look at the component state with this.state. In the following code, we look at the state and use it to decide what text to present to the user.

class Container extends React.Component { constructor(props) { super(props); this.state = { isMusicPlaying: false }; }
 render() { const status = this.state.isMusicPlaying ? 'Playing' : 'Not playing'; return ( 

{ status }

); }}

In the render function, this is always referring to the component it is within.

But that’s not very useful unless we have a way to change this.state.isMusicPlaying.

When Stuff Happens to Our Component

The user can interact with our components by clicking on the play button. We want to react (ha… ha…) to those events.

We do that through functions that take care of events. We call these event handlers.

class Container extends React.Component { constructor(props) { super(props); this.state = { isMusicPlaying: false }; }
 handleClick(event) { // Do something about the click };
 render() { let status = this.state.isMusicPlaying ? 'Playing :)' : 'Not playing :('; return ( 

{ status }

); }}

When the user clicks on the h1, our component will make the handleClick function run. The function gets the event object as the argument, which means it can use it if it wanted to.

We use the .bind method on handleClick to make sure this refers to the whole component, rather than just the h1.

What This Component Should Be Doing

When we change the state of our component, it will call the render function again.

We can change state with this.setState(), if we give it a new object representing the new state.

Our component on the page will always represent its current state. React does that for us.

handleClick() { if (this.state.isMusicPlaying) { this.setState({ isMusicPlaying: false }); } else { this.setState({ isMusicPlaying: true }); } };

But clicking an h1 isn’t as good as clicking our actual play button. Let’s make that work.

Talking Between Components

Your components can talk to each other. Let’s try it.

We can tell PlayButton whether or not the music is playing using something called props. Props are information shared from a parent component to a child component.

Props in JSX look the same as HTML properties.

We give PlayButton a prop called isMusicPlaying, which is the same as the isMusicPlaying in this.state.

class Container extends React.Component { constructor(props) { super(props); this.state = { isMusicPlaying: false }; }
 handleClick() { if (this.state.isMusicPlaying) { this.setState({ isMusicPlaying: false }); } else { this.setState({ isMusicPlaying: true }); } };
 render() { return ( ); }}

When the state of Container changes, PlayButton prop will change too, and the PlayButton function will be called again. That means our component will update on the screen.

Inside PlayButton, we can react to the change, because PlayButton gets the props as an argument:

function PlayButton(props) { const className = props.isMusicPlaying ? 'play active' : 'play'; return ;}

If we change our state to this.state = { isMusicPlaying: true }; and reload the page, you should see the pause button:

Events as Props

Your props don’t have to be just information. They can be functions.

function PlayButton(props) { const className = props.isMusicPlaying ? 'play active' : 'play'; return ;}
class Container extends React.Component { constructor(props) { super(props); this.state = { isMusicPlaying: false }; }
 handleClick() { if (this.state.isMusicPlaying) { this.setState({ isMusicPlaying: false }); } else { this.setState({ isMusicPlaying: true }); } };
 render() { return ( ); }}

Now, when we click on the PlayButton, it’ll change the state of Container, which will change the props of PlayButton, which will cause it to update on the page.

The Bad Thing About setState

setState is bad because it doesn’t do stuff right away. React waits a bit to see if there are more changes to make, then it does the state changes.

That means you don’t know for sure what your state will be when you call setState.

So you shouldn’t do this:

handleClick() { this.setState({ isMusicPlaying: !this.state.isMusicPlaying });};

If you are changing your state based on the old state, you need to do things differently.

You need to give setState a function, not an object. This function gets the old state as an argument, and returns an object that is the new state.

It looks like this:

handleClick() { this.setState(prevState => { return { isMusicPlaying: !prevState.isMusicPlaying }; });};

It is more difficult, but only needed when you are using the old state to make the new state. If not, you can just give setState an object.

What Are Refs?

Let’s make some music happen.

First, we add an io> tag:

class Container extends React.Component { constructor(props) { super(props); this.state = { isMusicPlaying: false }; }
 handleClick() { this.setState(prevState => { return { isMusicPlaying: !prevState.isMusicPlaying }; }); };
 render() { return ( ); }}

We need a way to get that io> tag and call e ither play () or pause() on it. We could do it with document.getElementById('audio').play() but there’s a better React way.

We give it a prop called ref, which gets called with the io> element as the first argument. It takes that &lt;audio> element and as signs it to this.audio.

 { this.audio = audioTag }} />

This function will be called every time the Container renders, which means this.audio will always be up to date, and equal the io> tag.

We then can play and pause the music:

handleClick() { if (this.state.isMusicPlaying) { this.audio.pause(); } else { this.audio.play(); } this.setState(prevState => { return { isMusicPlaying: !prevState.isMusicPlaying }; });};

Upload a music file (preferably an mp3 file) using the Choose files button and hit play, and watch it go!

Moving Outside of Index.html

As you might have guessed, our React shouldn’t live forever inside a pt>tag.

React takes a lot of build configuration. Fortunately, tools like Create React App take care of all that for you.

Install it to create your own React project. Follow their brief tutorial and start editing the JavaScript inside the src directory, applying all the React knowledge you learned here!

Congratulations!

You can now make React things.

Next, check out a couple of articles for more information. One is about React best practices, the other about a useful part of React called lifecycle methods.

If you learned something from this article, please click those clappin’ hands, and share it with your friends.

You can also follow me on Medium and Twitter.