不能在功能组件中使用 Ref()。 null 不是对象
Cannot useRef() in functional component. null is not an object
我有一个导致以下错误的功能组件:
null is not an object (evaluating 'textInput.current.blur'
不知道为什么
import React, { useState, useRef } from "react";
import { TextInput } from "react-native";
const UselessTextInput = ({ hide }) => {
const [text, onChangeText] = React.useState("Useless Text");
const textInput = useRef(null);
const _renderInput = () => {
if (hide) textInput.current.blur();
<TextInput
ref={textInput}
onFocus={() => ...}
onChangeText={onChangeText}
value={text} />
...
return __renderInput();
}
谁能解释一下这种行为?
如果您使用 ref
属性将 ref 设置为 DOM 节点,则 ref 的 current
属性 将仅在设置后即在 useEffect
回调或来自下一个渲染。
function Counter() {
const [count, setCount] = React.useState(0);
const divRef = React.useRef("initval");
console.log("During Render", divRef.current);
React.useEffect(() => {
console.log("Inside useEffect CB", divRef.current);
}, []);
return <button ref={divRef} onClick={() => setCount(count + 1)}>{count}</button>;
}
ReactDOM.render(<Counter />, document.getElementById("root"));
<script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<div id="root"></div>
了解流程:
当useRef
被调用时Reactreturns一个对象,其current
属性设置为提供的初始值("initval"
在我们的例子中)。
因此,第一次渲染期间的控制台日志会打印初始值。
然后从组件返回 JSX,更新 ref 并将其 current
属性 设置为 DOM 节点。
然后传递给 useEffect
的回调运行,由于 ref 已经更新,它打印 DOM 节点。
然后在下一次渲染中(可以通过单击按钮触发),我们再次调用 useRef
和 React returns 相同的对象,因此这次是日志在渲染期间打印 DOM 节点。
将 optional chaining 用于您的 textInput
值
像这样:textInput?.current?.blur();
我有一个导致以下错误的功能组件:
null is not an object (evaluating 'textInput.current.blur'
不知道为什么
import React, { useState, useRef } from "react";
import { TextInput } from "react-native";
const UselessTextInput = ({ hide }) => {
const [text, onChangeText] = React.useState("Useless Text");
const textInput = useRef(null);
const _renderInput = () => {
if (hide) textInput.current.blur();
<TextInput
ref={textInput}
onFocus={() => ...}
onChangeText={onChangeText}
value={text} />
...
return __renderInput();
}
谁能解释一下这种行为?
如果您使用 ref
属性将 ref 设置为 DOM 节点,则 ref 的 current
属性 将仅在设置后即在 useEffect
回调或来自下一个渲染。
function Counter() {
const [count, setCount] = React.useState(0);
const divRef = React.useRef("initval");
console.log("During Render", divRef.current);
React.useEffect(() => {
console.log("Inside useEffect CB", divRef.current);
}, []);
return <button ref={divRef} onClick={() => setCount(count + 1)}>{count}</button>;
}
ReactDOM.render(<Counter />, document.getElementById("root"));
<script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<div id="root"></div>
了解流程:
当
useRef
被调用时Reactreturns一个对象,其current
属性设置为提供的初始值("initval"
在我们的例子中)。因此,第一次渲染期间的控制台日志会打印初始值。
然后从组件返回 JSX,更新 ref 并将其
current
属性 设置为 DOM 节点。然后传递给
useEffect
的回调运行,由于 ref 已经更新,它打印 DOM 节点。然后在下一次渲染中(可以通过单击按钮触发),我们再次调用
useRef
和 React returns 相同的对象,因此这次是日志在渲染期间打印 DOM 节点。
将 optional chaining 用于您的 textInput
值
像这样:textInput?.current?.blur();