Zobrazit příspěvky

Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.


Příspěvky - registrovany123

Stran: 1 ... 11 12 [13] 14 15 ... 28
181
CELOU DOBU jsem to tu resil, s *** Jirsakem jsem tu marnil cas, a konecne mam odpoved, kterou zjevne adny mistni javascriptar nevi, ackoliv by teda mel.

Pochopitelně ví. Dokonce ti ji tu i psal. Problém je v tom, že ty z těch odpovědí čteš akorát půlku a o to víc trolíš:

Jinak ano, pokud se změní stav nějaké komponenty, React by default vyrenderuje celý podstrom komponent, i když se jejich props nezměnily. To je feature a dá se tomu samozřejmě zabránit.

Prestan lhat, tos napsal az po tady tomhle nesmyslu, ktery jsem vyzkousel a on nefungoval.

Citace
Radit ti je zbytečné, protože stejně všechny rady ignoruješ, ale kdyby to zajímalo někoho jiného:

Nevím jak ve Vue, v Reactu se to řešit dá. Například tak, že si člověk dá do Reduxu jednak objekt (asociativní pole) s obsahem klíč => řádek a pak pole klíčů, které určuje pořadí řádků. Pro každý řádek je komponenta a jako property má klíč řádku, který zobrazuje. Je napojená na Redux a z něj si z mapy příslušný řádek vyzvedne.

Když se změní řádek, tak pole klíčů se nemění, takže "for each" neproběhne. Změní se pouze asociativní pole. Proběhnou selektory pro každý řádek, ale až na jeden vrátí ten samý objekt, takže se vyvolá render pouze pro ten jeden změněný řádek.

Jinak co se týče řešení s kopií dat a tlačítkem "uložit", to je taky možnost.

182
Ja jsem tu problem ktery resim, jasne napsal, do detailu popsal, jediny "mareolan" poskytl spravnou odpoved - memo. Jasne jsem se ptal, proc se znova vola render, kdyz props vstupujici do komponenty se nezmenily, jakou to ma logiku, jak je to mozne.

Odpoved je, ze componentShouldUpdate() vraci by default true, aby s tim nemeli problem zacatecnici. A ze se ma pouzit PureComponent nebo Memo nebo pretizit componentShouldUpdate. Tohle byla odpoved na muj dotaz, proc se mi porad vola metoda called() uvnitr render funkce.

Ja si te na seznam niceho davat nebudu, chodim na tohle forum uz dobrych 15 let, ty na jistem "seznamu" uz davno jsi.

Val na https://stackoverflow.com/questions/40819992/react-parent-component-re-renders-all-children-even-those-that-havent-changed, a napis jim tam jako odpoved ty svoje rozumy - odpovez mu, ze se mu vsechny childy prerenderujouz duvodutoho, ze je vsechny prerendruje, protoze poitac dela to, co se mu zada. Uvidime kolik dostanes minus bodu - jestli uz nejsi davno na Stackoverflow vybodovany.

OK Systems zrovna rozjel inzerci, jestli tam nekdy pujdu, tak si dam hodne dobry pozor, abych na tebe nemusel narazit, protoze profesni interakce s tebou to musi byt opravdu zazitek...

183
SLAVA, ZAHADA ROZRESENA!!!


CELOU DOBU jsem to tu resil, s *** Jirsakem jsem tu marnil cas, a konecne mam odpoved, kterou zjevne adny mistni javascriptar nevi, ackoliv by teda mel.



https://stackoverflow.com/questions/40819992/react-parent-component-re-renders-all-children-even-those-that-havent-changed
Citace
React: Parent component re-renders all children, even those that haven't changed on state change

Citace
If a parent component is updated, does React always update all the direct children within that component?

No. React will only re-render a component if shouldComponentUpdate() returns true. By default, that method always returns true to avoid any subtle bugs for newcomers (and as William B pointed out, the DOM won't actually update unless something changed, lowering the impact).

Takze Filipe Jirsaku, oprav si svoji znalosti. Omlouvat se mi, pokud neches, nemusis, uz jsem ti vynadal dost.


Regards,
Registrovany123, Backend Software Engineer

184
(pro React) Dlouhé seznamy se obvykle optimalizují tak, že se pro položky udělá samostatná komponenta, tato bude navíc memoizovaná pomocí React.memo a při vykreslování seznamu se každé položce nastaví key. Díky té memoizaci se to renderování skutečně uřízne před voláním render-u na jednotlivých položkách (když se jim nezměnily propsy).

V upraveném příkladu se tedy bude opakovaně renderovat jenom první řádek (a App samozřejmě).

Kód: [Vybrat]
class A0 extends React.Component {
  constructor(props) {
    super();
    console.log("Constructor called ");
    this.state = {
      input: 1
    };
  }

  render() {
    console.log("A render, props: " + JSON.stringify(this.props));
    return <div>Input {this.state.input}</div>;
  }
}
const A = React.memo(A0);

class App extends React.Component {
  i = 0;
  constructor() {
    super();
    this.state = {
      arr: [
        { id: 0, val: 0 },
        { id: 1, val: 0 },
        { id: 2, val: 0 }
      ]
    };
  }

  componentDidMount() {
    setInterval(
      () =>
        this.setState({
          arr: this.state.arr.map((item) =>
            item.id === 0 ? { id: 0, val: this.i++ } : item
          )
        }),
      1000
    );
  }

  render() {
  console.log("App render");
    return (
      <div>
        {this.state.arr.map((i) => (
          <A key={i.id} data={i} />
        ))}
      </div>
    );
  }
}

ReactDOM.render(<App />, document.getElementById("container"));

Ano, zkousel jsem memo, a je to jediny zpusob, ktery zabrani vykresleni komponentypri updatu nadrazeneho stavu. Akorat jsem to nepouzil, protoze jsem si rozdelil FoodEntries do komponent FoodEntryDay, a pridal jsem tlacitko Ulozit, takze ted uz nemusi kazda zmena vyvolat update cele tabulky, ale jen FoodEntryDay, navic zbytecnym volanim metod jsem zabranil pres useState, kdy se mi dela diff na vstupni props.

Bohuzel vsak me to stalo duplikovani props do vnitrniho stavu.

Ale co je zajimave, tak ikdyz udelam:

Kód: [Vybrat]
const FoodEntriesTableDayRow = (props) => {
    const [totalCalories, setTotalCalories] = useState(FoodEntry.getTotalCalories(props.foodEntry));

    useEffect(() => {
        console.log(FoodEntriesTableDayRow.name, useEffect.name)
        setTotalCalories(FoodEntry.getTotalCalories(props.foodEntry))
    }, [props.foodEntry])

    const called = () => {
        console.log('Called!')
    }

    return (
        <tr>
            <td><input type="date" value={props.foodEntry.date}/></td>
            <td><Searchbox value={props.foodEntry.food.name}/></td>
            <td>
                <input type="number"
                       value={props.foodEntry.amount}
                       step={20}
                       onChange={(val) =>
                           props.onChange({...props.foodEntry, amount: val.target.value})
                       }/>
            </td>
            <td>{props.foodEntry.food.calories}</td>
            <td>{totalCalories}</td>
            <td>
                <input type="button" value="-" onClick={() => props.onRemove({...props.foodEntry})}/>
            </td>
        </tr>
    )
}

Konkretneji:

Kód: [Vybrat]
    useEffect(() => {
        console.log(FoodEntriesTableDayRow.name, useEffect.name)
        setTotalCalories(FoodEntry.getTotalCalories(props.foodEntry))
    }, [props.foodEntry])

Jeste kokretneji:

Kód: [Vybrat]
    }, [props.foodEntry])

Tak se mi sice neprovede funkce useEffect, kdyz se nikterak nezmenil props.foodEntry, ale stale se mi zbytecne zavola testovaci metoda called() volana z renderingu. Tomu dokaze zabranit jedine to Memo. Moc z toho nejsem moudry, proc React tu Render funkci znovu zavola, protoze nejsem uplne presvedcen, ze Memo je spravny zpusob reseni. Perfromance issues s tim nemam, jen mi to prijde jako skoda ze to React dela, a nechapu proc.

185
Co takhle?

A dukaz pro to mas? Nebo to je tve prani aby to tak bylo? Pripadne bych prosil zdroj. Protoze ty jsi z toho udelal Schrodingerovu kocku ted.

186
To snad neni pravda. Tak jeste jednou.

Budu mit 5000 FoodEntries, ktere vykreslim do tabulky o 5000 rows. Zmenim 1 FoodEntry:

Kód: [Vybrat]
foodEntries[0].amount = 500

1. Jak Vue, tak React, mi 5000x zavola vsechny metody, ktere se vyskytuji v tech 5000 rows, misto aby upravily jenom ten 1 row.
2. Ract mi 5000x zavola metody kazdeho row, ikdyz kazdy row bude zaobalen do vlastni Component, a tedy React prokazatelne muze vedet, ze dovnitr neprosla zadna zmena props.

Ad. 2: React tedy vi, ze do komponenty A dal props X, a ze zmenou "foodEntries[0].amount" nedoslo k zadne zmene property X, tudiz ze vnitrni stav komponenty A se nemohl nikterak zmenit, a ten blbec presto zbytecne zavola render komponenty A.

187
A jedna pro Jirsaka. Jirsaku, chapes vubec, ze kdyz udelam:

Kód: [Vybrat]
render() {
    return (
      <div>
        {this.state.arr.map((i) => (
          <div key={i.id}>
            <A></A>
            {i.val}
          </div>
        ))}
      </div>
    );
  }

ze this.state.arr.map() je volani metody, ktere ty zakazujes?

A chapes, Jirsaku, ze ten tag <A>[/url] je sam o sobe vlastne taky volani metody?

Jirsaku a chapes, ze to volani metody <A>[/url] se provede zbytecne 4999 krat, kdyz zmenis stav, ikdyz vnitrni stav A s tim nema nic spolecneho?

Jirsaku, bez jim do Ractu vynadat, ze udelali framework, kde uvnitr {} se musi volat metody, ze tak to byt nema.

188
Ba dokonce se ta metoda porad vola, ikdyz komponentu A dam uplne ven z toho foreache:

Kód: [Vybrat]

import React from "react";
import ReactDOM from "react-dom";

class A extends React.Component {
  constructor(props) {
    super();
    console.log("Constructor called ");
    this.state = {
      input: 1
    };
  }

  doSomething(input) {
    console.log("doSomething " + input);
    return input;
  }

  render() {
    return <div>Input {this.doSomething(this.state.input)}</div>;
  }
}

class App extends React.Component {
  i = 0;
  constructor() {
    super();
    this.state = {
      arr: [
        { id: 0, val: 0 },
        { id: 1, val: 0 },
        { id: 2, val: 0 }
      ]
    };
  }

  componentDidMount() {
    setInterval(
      () =>
        this.setState({
          arr: this.state.arr.map((item) =>
            item.id === 0 ? { id: 0, val: this.i++ } : item
          )
        }),
      1000
    );
  }

  render() {
    return (
      <div>
        <A></A>
        {this.state.arr.map((i) => (
          <div key={i.id}>{i.val}</div>
        ))}
      </div>
    );
  }
}

ReactDOM.render(<App />, document.getElementById("container"));



189
A ja nevim, proc jste vy prekvapen, ze nekdo je prekvapen zavolanim funkce v komponente, ktere se vubec nezmenil stav. Vite moc dobre o co se tady snazim, nedokazate to vysvetlit, ocividne tomu sam poradne nerozumite.

Udelam tohle:

{{ foodEntry.getTotalCalories() }}

Jaky je rozdil mezi vyuse uvedenym a timto:

{{ foodEntry.amount / 100 * foondEntry.calories }}

Od toho ty slozene zavorky hergot jsou! Vue to ma i v dokumentaci, ze se v tom delaji takovehle veci, od toho to sakra je. Muj kod je dukazem toho, ze vyse uvedeny vyraz se vykona 4999x.

Zase se tu rozciluju s Jirsakem...

190
Overil jsem, ze ustavicnemu volani metod z render funkce nezabrani ani zaobaleni do dalsi Component:

Kód: [Vybrat]
import React from "react";
import ReactDOM from "react-dom";

class A extends React.Component {
  constructor(props) {
    super();
    console.log("Constructor called ");
    this.state = {
      input: 1
    };
  }

  doSomething(input) {
    console.log("doSomething " + input);
    return input;
  }

  render() {
    return <div>Input {this.doSomething(this.state.input)}</div>;
  }
}

class App extends React.Component {
  i = 0;
  constructor() {
    super();
    this.state = {
      arr: [
        { id: 0, val: 0 },
        { id: 1, val: 0 },
        { id: 2, val: 0 }
      ]
    };
  }

  componentDidMount() {
    setInterval(
      () =>
        this.setState({
          arr: this.state.arr.map((item) =>
            item.id === 0 ? { id: 0, val: this.i++ } : item
          )
        }),
      1000
    );
  }

  render() {
    return (
      <div>
        {this.state.arr.map((i) => (
          <div key={i.id}>
            <A></A>
            {i.val}
          </div>
        ))}
      </div>
    );
  }
}

ReactDOM.render(<App />, document.getElementById("container"));


K cemu potom je, ze si Vue a React vnitrne delaji diff mezi stavy, kdyz ocividne stejne vsem renderum znovu zas a znova natstavuji hodnoty. Muj kod je toho dukazem. To, ze nebudu volat zadnou metodu uvnitr renderu, nic nemeni na faktu, ze se porad dokolecka vsechny hodnoty setuji znovu a znovu.

Navic vyse uvedeny priklad ukazuje, jak podivny mechanismus to je.

1. Ta vnitrni komponenta A nebere zadne properties z vnejsku.
2. Zmenou fieldu v arr nemohlo nikterak dojit k uprave vnitrniho stavu komponenty A. Nemelo k tomu jak dojit, kdyz do A nestrkam zadne values.
3. Presto React zavola metody uvnitr komponenty A.

Otazka do pranice podporujici konstruktivni debatu: tak co je to sakra za shit?

Jedine vysvetleni je, ze to React cele znovu renderuje.

Vyse uvedene je dulezity principialni priklad, a zadam mistni javascriptare, aby to vysvetlili.

191
A co volani getteru v radcich tabulky? To je taky funkce. Pokud ani to nemuzu delat, tak v tom pripade nemuzu vubec pouzivat OOP.

Budu mit napriklad tridu FoodEntry, kde budu mit

getTotalCalories() {
  return this.amount / 100 * this.calories;
}

Podle vas tedy nemuzu delat ani tady to. A v tom pripade se mi zkomplikuje uplne vsechno.

192
Takze principialni problem, predlozeny na zacatku, ze totiz mam tabulku o 5000 radcich, upravim item v 1 radku, a dojte k zavolani metod v cele tabulce, je stale platny, a navrhovane reseni v Reactu pomoci foreache ktery iteruje nad necim jinym, nez nad polozkami jednotlivych radku, se miji ucinkem.

Proto zatim jako jedine vychodisko vidim vytvorit separatni komponenty pro kazdy radek, nakopirovani props do stavu, a pridani tlacitka ulozit.

Rovnez zatim nevidim vyhodu pouziti Reactu namisto Vue.

193
Nevím jak ve Vue, v Reactu se to řešit dá. Například tak, že si člověk dá do Reduxu jednak objekt (asociativní pole) s obsahem klíč => řádek a pak pole klíčů, které určuje pořadí řádků. Pro každý řádek je komponenta a jako property má klíč řádku, který zobrazuje. Je napojená na Redux a z něj si z mapy příslušný řádek vyzvedne.

Tebou navrhovane reseni neni funkcni, zkousel jsem to a i React zavola metody ve foreach pri kazde aktualizaci stavu:

Kód: [Vybrat]
import React from "react";
import ReactDOM from "react-dom";

class App extends React.Component {
  i = 0;
  constructor() {
    super();
    this.state = {
      vals: [0, 1, 2],
      arr: [
        { id: 0, val: 0 },
        { id: 1, val: 0 },
        { id: 2, val: 0 }
      ]
    };
  }

  called() {
    console.log("Called");
  }

  componentDidMount() {
    // setInterval(
    //   () => this.setState({ arr: [...this.state.arr, this.i++] }),
    //   1000
    // );
    setInterval(
      () =>
        this.setState({
          arr: this.state.arr.map((item) =>
            item.id === 0 ? { id: 0, val: this.i++ } : item
          )
        }),
      1000
    );
  }

  render() {
    return (
      <div>
        {this.state.vals.map((i) => (
          <div key={i}>
            {this.called()}
            {this.state.arr[i].val}
          </div>
        ))}
      </div>
    );
  }
}

ReactDOM.render(<App />, document.getElementById("container"));


194
Dotaz neni stale zodpovezen. Ma se za to, ze jak React tak Vue udelaji vnitrne diff pri zmene stavu, a nasledne budou sahat jen do tech tagu, kterych se zmena stavu tyka. Muj kod dokazuje ze to tak uplne neni pravda jak pro React, tak pro Vue, a nikdo to tady neumi uplne vysvetlit.

Co se tyce volani funkci v template, asi tezko bude problem zavolat tam funkci napr. parseFloat(), je snad na to nekde nejake doporuceni, ze ani to se nema? Pokud bych mel tabulku o 1000 radku (coz bych klidne mohl), tak se mi bude 1000x volat parse float pri kazde jeden zmene Input Number ciselniku, kuprikladu. Proste upravim stav 1 itemu, a upravi se zbyvajicich 999 itemu.

195
Compute jsem zkousel, ale to neni reseni. Me se jedna o metody volane uvnitr foreache, computed se nevola jako metoda, ale jako property.

A jak v tom pomuze React? Zkousel jsem to a chova se to stejne, upravim jen jeden radek z foreache, a metoda called() se zavola pro vsechny radky vzdy. Je to stejne chovani jako v magickem Vue.

Kód: [Vybrat]

import React from "react";
import ReactDOM from "react-dom";

class App extends React.Component {
  i = 0;
  constructor() {
    super();
    this.state = {
      arr: [
        { id: 0, val: 0 },
        { id: 1, val: 0 },
        { id: 2, val: 0 }
      ]
    };
  }

  called() {
    console.log("Called");
  }

  componentDidMount() {
    // setInterval(
    //   () => this.setState({ arr: [...this.state.arr, this.i++] }),
    //   1000
    // );
    setInterval(
      () =>
        this.setState({
          arr: this.state.arr.map((item) =>
            item.id === 0 ? { id: 0, val: this.i++ } : item
          )
        }),
      1000
    );
  }

  render() {
    return (
      <div>
        {this.state.arr.map((i) => (
          <div key={i.id}>
            {this.called()}
            {i.val}
          </div>
        ))}
      </div>
    );
  }
}

ReactDOM.render(<App />, document.getElementById("container"));




Citace
Rozumné východisko je naučit se ty frameworky používat a neřešit věci, které není potřeba řešit a kterým nerozumíte.

PS: Ja tady na to zakladam tema, a jak vidite, tak se to prave ucim pouzivat, a snazim se tomu rozumet - proto se tu na to ptam, proto tohle tema zakladam, jsem na diskuznm foru. Nevim, proc musite mit ustavicne takove utocne a curacke prupovidky - jste snad debil? Pokladam tady normalni, odrojakovany dotaz na vnitrni chovani tech frameworku.

Stran: 1 ... 11 12 [13] 14 15 ... 28