React rendera komponent "onClick"

Permalänk

React rendera komponent "onClick"

Jag har skapat en liten applikation som listar länder från ett api via en söksträng. När man skrivit in tillräckligt många tecken för att bara matcha ett land så visas istället en detaljerad vy över just det landet. Den funktionen funkar men jag försöker få till det så att när länderna listas så visas även en knapp bredvid som man ska kunna klicka på för att komma direkt till detaljöversikten för det landet. Men jag förstår inte hur jag ska göra för att få det att fungera.

Jag trodde att jag skulle kunna använda samma Komponent som tidigare genom att aktivera den onClick:
"const buttonHandler = (country) =>
<CountryDetails country={country} />"

Men det funkar inte, då inget händer när jag klickar på knappen. Någon som vet hur jag ska göra för att få till funktionen?

CountryListing

import React from 'react' import CountryDetails from './CountryDetails' const buttonHandler = (country) => <CountryDetails country={country} /> const CountryListing = ({ country }) => <p style={{ margin: 0 }}>{country.name}<button onClick={() => buttonHandler(country)}>show</button></p> export default CountryListing

Country

import React from 'react'; import Languages from './Languages'; const CountryDetails = ({ country }) => <div> <h2>{country.name}</h2> <p style={{ margin: 0 }}>capital {country.capital}</p> <p style={{ margin: 0 }}>population {country.population}</p> <h3>languages</h3> <ul> <Languages languages={country.languages} /> </ul> <img src={country.flag} height="100" width="100" alt="country flag" /> </div> export default CountryDetails

Permalänk
Kontot avslutas

Lånar tråden istället för att göra en helt ny.
Inte pillat speciellt mycket med React så jag blir lite förvirrad av vissa saker, har en fråga:
Hur får man en simpel button onClick att fungera på mobil?
Har sökt på nätet och provat det som kommit upp men det har inte fungerat, t ex onTouchEnd.

Permalänk
Medlem
Skrivet av ChrisDev:

Lånar tråden istället för att göra en helt ny.
Inte pillat speciellt mycket med React så jag blir lite förvirrad av vissa saker, har en fråga:
Hur får man en simpel button onClick att fungera på mobil?
Har sökt på nätet och provat det som kommit upp men det har inte fungerat, t ex onTouchEnd.

Kan du visa koden du testar med? `onClick` borde fungera som den är, även i mobil. Du kan använda ex. https://codesandbox.io/.

Permalänk
Kontot avslutas
Skrivet av WreXlaM:

Kan du visa koden du testar med? `onClick` borde fungera som den är, även i mobil. Du kan använda ex. https://codesandbox.io/.

Är kanske inte mobilen som är problemet insåg jag nu.

Permalänk
Medlem

Man kan inte returnera något i onClick. Detta gäller alla event handlers. (Eller kan och kan – React ignorerar i alla fall det du returnerar. Som tanke-experiment – om du kunde returnera element, hur skulle React veta var det ska visas?)

Det man i regel gör i onClick är att anropa funktioner som till slut gör en ”setState”. När man uppdaterar state i React så renderar React automatiskt om. Detta gör att du kan visa olika saker beroende på vad som är i ditt state.

Du skulle kunna göra något i den här stilen:

import React from 'react' import CountryDetails from './CountryDetails' const CountryListing = ({ country, showDetails, onShowClick }) => <p style={{ margin: 0 }}> {country.name} <button onClick={() => onShowClick()}> show </button> {showDetails && <CountryDetails country={country} />} </p> export default CountryListing

Vi har en prop ”showDetails” (boolean) som avgör om detaljerna ska synas eller inte.

Och så har vi en prop “showDetails” som är en funktion som ska köras vid klick på knappen.

Den som renderar CountryListing blir nu ansvarig för att hålla reda på vilka länder som är expanderade och att passa in en funktion som kan ändra på detta.

Du skulle också kunna ha state direkt i CountryListing. Något i stil med:

import React from 'react' import CountryDetails from './CountryDetails' const CountryListing = ({ country }) => { const [showDetails, setShowDetails] = React.useState(false) return <p style={{ margin: 0 }}> {country.name} <button onClick={() => setShowDetails(!showDetails)}> show </button> {showDetails && <CountryDetails country={country} />} </p> } export default CountryListing

Notera: Det var ett tag sedan jag höll på med React och jag testade inte koden innan jag postade så det kanske inte fungerar 100% men borde inte vara jättefel i alla fall.