Het beheer Staat in Reageren met Onuitgesproken-Volgende

0
53

In een vorige post zagen we hoe manage staat met de Onuitgesproken. Zoals je misschien herinneren, Onuitgesproken maakt gebruik van Reageren is gebouwd in setState om u toe te laten maken van componenten die kunnen consumeren staat door een abonnement bij een provider — zoals het Reageren op de Context van de API.

Goed, we gaan bouwen uit dat laatste post door te kijken naar de Onuitgesproken Volgende, een bibliotheek auteur Jamie Kyle wordt aangeduid als de “spirituele opvolger” te zijn Onuitgesproken project. Onuitgesproken Volgende biedt zowel Reageren Haken en de Context API voor het beheer van de staat. Onuitgesproken was een minimale onttrekking aan het idee van Reageren Haken voordat ze werden een volwaardige ding. Maar nu Haken op Reageren zijn zo goed, dat de abstractie is onnodig en Onuitgesproken Naast gewoon geïncorporeerd, terwijl het verstrekken van een API om hun toestand te delen en logica met de Haken.

We gaan specifiek in op het beheren van state in zowel enkele als meerdere componenten met behulp van Onuitgesproken Volgende. Het kan nuttig zijn om te controleren de vorige post op Onuitgesproken voorafgaand aan het vooruit gaan, maar het is niet absoluut noodzakelijk.

Voorbeeld: Een minimale vorm component

Om te beginnen maken we een kleine Reageren aanvraag voor een vorm die slechts uit een tekst input voor de naam van een persoon en een knop om te verzenden. Wanneer de knop wordt aangeklikt, geven we de naam als een lid element boven het formulier. De bron code voor dit voorbeeld is beschikbaar op GitHub.

Dit gaat om een Bootstrap Reageren toepassing die we kunnen laten draaien door gebruik te Maken van Reageren App. Laten we installeren en vervolgens mappen wijzigen in de project map.

npx maken-reageren-app onuitgesproken-next-vorm
cd-onuitgesproken-next-formulier>

We moeten toe te voegen Onuitgesproken Volgende als een afhankelijkheid:

## garen
garen toevoegen onuitgesproken-volgende

## npm
npm install –opslaan onuitgesproken-volgende

We maken gebruik van Reageren Haken en createContainer van Onuitgesproken Volgende, dus laten we importeren in de App is onderdeel:

// src/App.js
importeren Reageren, { useState } van ‘reageren’;
importeren { createContainer } van “stilzwijgende volgende”;

Vervolgens maken we een aangepaste haak. We hebben onze state in, die we kunnen creëren met behulp van useState:

// src/App.js
// …hetzelfde als voorheen,

const useForm = () => {
const [input, setValue] = useState(“”);
const [naam, setName] = useState(“Barney Stinson”);

const handleInput = event => {
setValue(event.doel.waarde);
};

const updateName = event => {
evenement.preventDefault();
setName(input);
setValue(“”);
};

terug {
input,
naam,
handleInput,
updateName,
};
};

We hebben twee staten die hier worden gedefinieerd. de input zal worden gebruikt voor het bijhouden van waarden die worden ingevoerd in het tekst invoer en het zal worden bijgewerkt met behulp van de handleInput methode. de naam zal worden bijgewerkt wanneer de knop wordt aangeklikt, die zal leiden tot de updateName methode.

OK, nu kunnen we het maken van een container door ons aangepaste haak als een parameter voor de createContainer() methode.

// src/App.js
// …hetzelfde als voorheen,

const FormContainer = createContainer(useForm);

Hiermee maakt u een container die we kunnen gebruiken in onze applicatie. Ja, u leest het goed, maar laten we even een stap op een moment. We beginnen met dit onderdeel te zien hoe het werkt met Onuitgesproken Volgende.

Nu, laten we een Formulier maken onderdeel dat ziet er zo uit.

// src/App.js
// …hetzelfde als voorheen,

const Vorm = () => {
const vorm = FormContainer.useContainer();
return (
<div>
<p>Hallo! {formulier.naam}</p>
<div>
<input
type=”text”
waarde={formulier.input}
onChange={formulier.handleInput}
/>
<button onClick={formulier.updateName}>Opslaan</button>
</div>
</div>
);
};

We zijn het toekennen van de variabele vorm van de waarde die is verkregen van bellen FormContainer.useContainer(). De waarde bevat de staten en methoden die zijn gedefinieerd in de aangepaste haak die we hoger aangemaakt hebben. Met dat we gebruik kunnen maken van de staat en methoden — maar voor dat gebeurt, moeten we wikkel de Vorm onderdeel van een provider.

const App = () => (
<Form.Provider>
<Form />
</Vorm.Provider>
)

Met wat je tot nu toe geleerd hebt, probeer dan het bouwen van een minimale toepassing met Onuitgesproken Volgende. Als u geplakt wordt, voel je vrij om dit te controleren archief om te zien hoe ik de mijne.

Voorbeeld: het Delen van state over meerdere onderdelen

OK, dus je hebt een hint eerder dat we kunnen gebruik maken van ons formulier container overal waar we zijn willen. Een van de voordelen van het gebruik van Onuitgesproken is dat het het mogelijk maakt om hun toestand te delen over meerdere onderdelen. Om te zien hoe dit werkt, bouwen we een kleine app die gebruik maakt van het formulier functies die we gemaakt boven en maakt het ook mogelijk om taken met behulp van dezelfde staat. De naam van de gebruiker kan worden bijgewerkt in de vorm component, en deze update zal ook tot uiting komen in de component. Twee vogels van een veer!

Er is een repo voor dit voorbeeld, dus voel je vrij om te klonen of download het als we ploegen.

Laat draaien tot een nieuw project en het installeren van de benodigde afhankelijkheden:

npx maken-reageren-app onuitgesproken-next-app
cd-onuitgesproken-next-app
garen onuitgesproken-naast shortid

Het staat voor de toepassing woont in een apart bestand. We willen de lidstaten voor de vorm en doe-onderdelen in de winkel, en de methoden die nodig zijn voor het bijwerken van hen ook. Het maken van een store.js bestand in de map src en maken het eruit als dit;

// src/store.js
importeren { useState } van “reageren”;
importeren shortid van “shortid”
importeren { createContainer } van ‘onuitgesproken-next’
export const useStore = () => {
// De bouw van een lijst met twee standaard taken
const list = [
{ id: 1, titel: ‘het Schrijven van code’ },
{ id: 2, titel: ‘melk Koopt’ }
]
const [input, setValue] = useState(“”);
// Laten we de legen-wacht voor het-dary standaard naam die updates op formulier indienen
const [naam, setName] = useState(“Barney Stinson”);
const [todos, addTodo] = useState(lijst);
const [item, setTodo] = useState(“”);
const handleInput = event => {
setValue(event.doel.waarde);
};
const updateName = event => {
evenement.preventDefault();
setName(input);
setValue(“”);
};
const handleTodo = event => {
setTodo(event.doel.waarde);
};
const handleSubmit = event => {
evenement.preventDefault();
const value = {
id: shortid.genereer(),
titel: item
}
addTodo(todos.concat(waarde));
setTodo(“”);
};
terug {
input,
naam,
handleInput,
updateName,
todos,
item
handleTodo,
handleSubmit
};
}
export const StoreContainer = createContainer(useStore)

Wij maken gebruik van useState() om de staten die we nodig hebben. De methoden worden gedefinieerd en dit gebeurt allemaal in de aangepaste haak, useStore(). We maken de StoreContainer en dan pas useStore() als parameter om de createContainer(). Met dat we gebruik kunnen maken van de StoreContainer in de benodigde onderdelen waar gebruik wilt maken van de staat en van de methoden die we hebben gedefinieerd.

Te beginnen met de vorm sectie, maak een bestand genaamd form.js en het moet eruit zien als wat ik heb hieronder;

// src/form.js
importeren Reageren van “reageren”;
importeren { StoreContainer} van “./opslaan”;

const FormComponent = () => {
const vorm = StoreContainer.useContainer();
return (
<div>
<p>Hallo! {formulier.naam}</p>
<div>
<input type=”text” value={formulier.input} onChange={formulier.handleInput} />
<button onClick={formulier.updateName}>Naam Wijzigen</button>
</div>
</div>
);
};
export standaard FormComponent;

We gebruiken StoreContainer om toegang te krijgen tot de staat en van de methoden die we nodig hebben. We doen hetzelfde voor de taak component die u kunt maken in een todo.js -bestand.

// src/todo.js
importeren Reageren van “reageren”;
importeren { StoreContainer } van “./opslaan”;

const TodoComponent = () => {
const todo = StoreContainer.useContainer();
return (
<div>
<p>Toevoegen Todos</p>
<input type=”text” value={todo.item} onChange={todo.handleTodo} />
<button onClick={todo.handleSubmit}>Toevoegen</button>
<div>
<p>Geachte {todo.naam}, hier zijn uw huidige taken;</p>
{todo.todos.kaart((item) => {
return (
<ul key={item.id}>
<li>{item.titel}</li>
</ul>
);
})}
</div>
</div>
);
};
export standaard TodoComponent;

U kunt zien dat tedoen.de naam kan alleen worden bijgewerkt in de FormComponent. Dat is omdat we een manier nodig om de staat in beide onderdelen. Dat is de reden waarom we gaan weer naar de Provider en u er een toevoegen in de App component, net zoals we in het vorige voorbeeld.

importeren Reageren van ‘reageren’;
importeren TodoContainer uit “./todo”;
importeren FormContainer uit “./formulier”;
importeren { StoreContainer } van “./winkel”

functie-App() {
return (
<div className=”App”>
<StoreContainer.Provider>
<FormContainer />
<TodoContainer />
</StoreContainer.Provider>
</div>
);
}
export standaard applicatie;

Daar gaan we! Door het toevoegen van de provider kunnen de gegevens worden overgenomen uit het formulier component, opgeslagen in de provider, en gingen terug naar de lijst met taken. 💥