Your UI is a function of your state, and props are to components what arguments are to functions.
-- Tyler McGinnis ~ React Aha Moments
Vi ska använda föregående struktur för att göra koden mer återanvändbar samtidigt som vi fördjupar oss inom just props. Props är som argument för ditt UI. Du skickar ner variabler till dina komponenter och sen kan du bestämma vad som ska renderas och hur komponenten ska renderas. Du kan tänka på dina komponenter som funktioner som tar emot ett eller flera argument, i React är dessa argument props. Och som i vanlig javascript behöver inte parametrar och argument ha samma namn
//add a prop called 'name' to your component, the value can be,
//like in this case, a string. But it can also be an object, function,
//bool or anything!
class App extends React.Component{
render(){
return(
<div>
<Header name="Jesper"/>
</div>
);
}
}
// 'this.props' contains all the props we send down, you can name them
// anything you want: name="Jesper" === this.props.name
class Header extends React.Component{
render(){
return(
<h1>Hello {this.props.name} </h1>
);
}
}- Använd samma projekt som från föregående övning med komponenter. Implementera ovanstående kod så att du får det att fungera och att din
Headervisar ditt namn på sidan genom att ta emot värdet viathis.props.name. - Lägg till en till
proppåHeader-komponenten som hetergreetingoch skicka med ett till värde som bestämmer vilken hälsningsfras som ska skrivas ut. Se till så att komponenten är uppdaterad också, spara och ladda om sidan. - Skapa ett objekt utanför din klass som innehåller både
greetingsamtname. Istället för att skicka ner två olikaprops. Skicka ner enbart ditt objekt som en ensamprop. Vad måste vi ändra på i komponenten för att vår kod ska fungera? Kan vi fortfarande referera tillgreetingochname? - Skicka med
propstill dina 3 likadana paragrafer och gör så att varsin paragraf får olika textfärg och font.
Props kan i princip vara vad som helst och behöver inte vara en sträng. Du kan skicka ner bool, objekt eller arrayer som props precis som du kan skicka vilket värde som helst till en funktion i JavaScript
- Lägg till en till
proppåHeadersom ska hetaisVisibleoch sätt den tilltrue. - I din
Header-komponent. Skriv enif-sats som använderisVisibleoch som bestämmer om<h1>-taggen ska visas eller inte. Testa att ändraisVisibletillfalseefter att du har skrivitif-satsen och då ska<h1>-taggen inte synas. - Ta en titt på conditional rendering@react . De radar upp flera olika sätt att skriva
if-satser. Försök att implementera denna if-sats på ett annorlunda sätt än det du använde från början. Ta hjälp av dokumentationen.
Alla komponenter behöver inte vara självslutande utan vi kan även ha omslutande komponenter. För att komma åt innehållet inuti en komponent som är omslutande måste vi använda this.props.children. Det som läggs innanför Button-komponenten blir automatisk till this.props.children så vi kan i denna struktur inte döpa texten "Click me!" till något annat än this.props.children. Vi ska återkomma till denna struktur längre fram i kursen och hur vi jobbar med den.
class App extends React.Component{
render(){
return(
<div>
<Button> Click me! </Button>
</div>
);
}
}
class Button extends React.Component{
render(){
return(
<button>
{ this.props.children } //"Click me!"
</button>
);
}
}- Implementera ovanstående kod så att du får ut rätt resultat på sidan. Använd din
<Button>-komponent var du vill. Vi ska använda den i framtida kod. - Skapa en funktion i din
App-komponent som loggar ut"Hej"varje gång man kallar på funktionen. Man binder en funktion till en knapp medonClick. - Testa att skicka med t.ex. en
Paragraph-komponent inomButton, alltså istället för texten"Click me!". Vad händer?
1-2
//add a prop called 'name' to your component, the value can be,
//like in this case, a string. But it can also be an object, function,
//bool or anything!
class App extends React.Component{
render(){
return(
<div>
<Header name="Jesper" greeting="wow just go away"/>
</div>
);
}
}
// 'this.props' contains all the props we send down, you can name them
// anything you want: name="Jesper" === this.props.name
class Header extends React.Component{
render(){
return(
<h1>{this.props.greeting} {this.props.name} </h1>
);
}
}class App extends React.Component{
render(){
return(
<div>
<Header values={values} />
</div>
);
}
}
const values = {
name: "Jesper",
greeting: "wow just go away"
}
//We can send an object just like in regular javascript but we have to traverse deeper into the object.
class Header extends React.Component{
render(){
return(
<h1>{this.props.values.greeting} {this.props.values.name} </h1>
);
}
}class App extends React.Component{
render(){
return(
<div>
<Header name="Jesper" greeting="wow just go away" />
<Paragraph style={style1} />
<Paragraph style={style2} />
<Paragraph style={style3} />
</div>
);
}
}
//Easiest is to create an object with each style and pass it as props
//You can also add a class to the paragraph or send individual props
const style1 = {
color: 'teal',
fontFamily: 'monospace'
}
const style1 = {
color: 'lightsalmon',
fontFamily: 'sans-serif'
}
const style3 = {
color: 'paleviolet',
fontFamily: 'serif'
}
class Paragraph extends React.Component{
render(){
return(
<p style={this.props.style}> What's in style? </p>
);
}
}class App extends React.Component{
render(){
return(
<div>
<Header values={values} isVisible={true}/>
</div>
);
}
}
const values = {
name: "Jesper",
greeting: "wow just go away"
}
class Header extends React.Component{
//Render is a function, if and else works like in regular JavaScript
//if the prop is true, return element, if not, return null, nothing.
render(){
if(this.props.isVisible){
return(
<h1>
{this.props.values.greeting} {this.props.values.name}
</h1>
);
}else{
return null;
}
}
}class App extends React.Component{
//'handleClick' belongs to the component, so when we reference it,
//we have to call it by 'this.handleClick'
handleClick = () =>{
console.log('Hej');
}
//onClick is a props, it doesn't have to be namned 'onClick' on the
//component
//this.props.children can be another component or multiple
//components
render(){
return(
<div>
<Button onClick={this.handleClick}>
<Paragraph/>
</Button>
</div>
);
}
}
class Button extends React.Component{
//It does have to have the name 'onClick' on the actual button element
//remember, Component !== html-element
render(){
return(
<button onClick={this.props.onClick}>
{ this.props.children }
</button>
);
}
}