React.useCallback を別の React.useCallback 内で使用できますか?
<p>汚れ用のカップ写真のコンポーネントが 1 つあります</p>
<p>
<pre class="brush:js;toolbar:false;">React を "react" からインポートします。
const User = React.memo(function({id, name, isSelected, ...other}) {
戻る (
<div {...other}>
{名前} - {isSelected && 「選択済み」}
</div>
);
});
デフォルトのユーザーをエクスポート;</pre>
</p>
<p>および渲染用户卡の父構成要素</p>
<p>
<pre class="brush:js;toolbar:false;">React を "react" からインポートします。
関数アプリケーション() {
const [users, setUsers] = React.useState([
{id: 1、名前: "ジョン ドゥ #1"}、
{id: 2、名前: "ジョン ドゥ #2"}、
{id: 3、名前: "ジョン ドゥ #3"}
]);
const [selectedUserId, setSelectedUserId] = React.useState(null);
return users.map((user) => {
const isSelected = selectedUserId === user.id;
戻る (
<ユーザー
{...ユーザー}
key={ユーザーID}
isSelected={isSelected}
onClick={() => setSelectedUserId(user.id)}
/>
);
});
}
デフォルトのアプリケーションをエクスポート;</pre>
</p>
<p>任務は「ユーザーを選択した後、他のユーザーの再汚染を避ける」</p>
<p>我尝试は <code>React.useCallback</code> を使用します。钩子、これは我の第一实现</p>
<p>
<pre class="brush:js;toolbar:false;">React を "react" からインポートします。
const User = React.memo(function({id, name, isSelected, ...other}) {
戻る (
<div {...other}>
{名前} - {isSelected && 「選択済み」}
</div>
);
});
関数アプリケーション() {
const [users, setUsers] = React.useState([
{id: 1、名前: "ジョン ドゥ #1"}、
{id: 2、名前: "ジョン ドゥ #2"}、
{id: 3、名前: "ジョン ドゥ #3"}
]);
const [selectedUserId, setSelectedUserId] = React.useState(null);
const handleSelectUser = React.useCallback((userId) => () => {
setSelectedUserId(userId);
}、[]);
return users.map((user) => {
const isSelected = selectedUserId === user.id;
戻る (
<ユーザー
{...ユーザー}
key={ユーザーID}
isSelected={isSelected}
onClick={handleSelectUser(user.id)}
/>
);
});
}
デフォルトのアプリケーションをエクスポート;</pre>
</p>
<p>この場合、<code>React.useCallback</code> は新しい参照を含む匿名関数を返します</p>
<p><strong>結果: すべてのユーザー カードは、クリックするたびに再レンダリングされます</strong></p>
<p>この匿名関数を <code>React.useCallback</code></p> でラップすることにしました。
<p>
<pre class="brush:js;toolbar:false;">React を "react" からインポートします。
const User = React.memo(function({id, name, isSelected, ...other}) {
戻る (
<div {...other}>
{名前} - {isSelected && "選択済み"}
</div>
);
});
関数アプリケーション() {
const [users, setUsers] = React.useState([
{id: 1、名前: "ジョン ドゥ #1"}、
{id: 2、名前: "ジョン ドゥ #2"}、
{id: 3、名前: "ジョン ドゥ #3"}
]);
const [selectedUserId, setSelectedUserId] = React.useState(null);
const handleSelectUser = React.useCallback((userId) => {
return React.useCallback(() => {
setSelectedUserId(userId);
}、[]);
}、[]);
return users.map((user) => {
const isSelected = selectedUserId === user.id;
戻る (
<ユーザー
{...ユーザー}
key={ユーザーID}
isSelected={isSelected}
onClick={handleSelectUser(user.id)}
/>
);
});
}
デフォルトのアプリケーションをエクスポート;</pre>
</p>
<p>問題は解決しましたが、まだ疑問が 1 つあります。正しくできましたか? React チームは次のように述べています: <em>ループ、条件分岐、またはネストされた関数内でフックを呼び出さない</em>どのような副作用が発生しますか? </p>
<p><code>user</code>コンポーネント</p>には触れないでください。