Reactの知識ポイントのまとめ(2つ)
1.リストループレンダリングのキーにインデックスを使用しない方がよいのはなぜですか?
例:
変更前の配列の値は[1,2,3,4]であり、キーは対応する添え字です:0,1,2,3変更後の配列の値は[4,3、 2,1]であり、キーはに対応します。の添え字も0、1、2、3です。
キーは同じですが値が異なるため、削除と追加の操作が実行されますが、移動操作が元々実行できる場合は、削除と追加の操作のパフォーマンスが明らかに向上します。
第二に、コンテキストとは何ですか?
コンテキストは、コンポーネントの各レイヤーに小道具を手動で追加せずに、コンポーネントツリー間でデータを転送する方法を提供します。
// Context 可以让我们无须明确地传遍每一个组件,就能将值深入传递进组件树。
// 为当前的 theme 创建一个 context(“light”为默认值)。
const ThemeContext = React.createContext('light');
class App extends React.Component {
render() {
// 使用一个 Provider 来将当前的 theme 传递给以下的组件树。
// 无论多深,任何组件都能读取这个值。
// 在这个例子中,我们将 “dark” 作为当前的值传递下去。
return (
<ThemeContext.Provider value="dark">
<Toolbar />
</ThemeContext.Provider>
);
}
}
// 中间的组件再也不必指明往下传递 theme 了。
function Toolbar() {
return (
<div>
<ThemedButton />
</div>
);
}
class ThemedButton extends React.Component {
// 指定 contextType 读取当前的 theme context。
// React 会往上找到最近的 theme Provider,然后使用它的值。
// 在这个例子中,当前的 theme 值为 “dark”。
static contextType = ThemeContext;
render() {
return <Button theme={
this.context} />;
}
}
1.createContextオブジェクトを作成します
2.コンポーネントをラップして、Context.Providerで値を取得します
3.アクセスをstatic contextType = ThemeContext;
使用するthis.context
ようにコンポーネントを設定します
3つの制御されたコンポーネントと制御されていないコンポーネント
1.制御されたコンポーネント
- コンポーネントをレンダリングするための唯一のデータソースは、コンポーネントの状態です。
- このコンポーネントは、データが変更されたときに実行する必要のある操作も担当します
そして持っている現在の値を設定するために使用されるプロパティ。<input>
<textarea>
<select>
value
2.制御されていないコンポーネント
フォームデータはDOMノードによって処理されref
、フォーム要素の値を取得するために使用できます。
4、Reactポータル
ポータル==>「ポータル」。親コンポーネントの外部に存在するDOMノードに子ノードをレンダリングするための優れたソリューションを提供します。
目的:ダイアログダイアログボックスを作成する場合は、ダイアログボックスを中央に配置する必要がありますが、ダイアログボックスコンポーネントを固定位置に書き込むと、親コンポーネントのCSSスタイルの影響を受けやすいため、ダイアログボックスコンポーネントをポータルから指定した位置に移動します。
使用する:
import React from 'react';
import {
createPortal} from 'react-dom';
class Dialog extends React.Component {
constructor() {
super(...arguments);
const doc = window.document;
this.node = doc.createElement('div');
doc.body.appendChild(this.node);
}
render() {
return createPortal(
<div class="dialog">
{
this.props.children}
</div>, //塞进传送门的JSX
this.node //传送门的另一端DOM node
);
}
componentWillUnmount() {
window.document.body.removeChild(this.node);
}
}