在 React Native 中使用问号的 useRef 表达式
useRef expressions using question marks in React Native
我学习了一些关于在 React Native 函数中使用 'useRef' 钩子的知识。在检查我在 Internet 上找到的一些代码时......我看到了包括问号(“?”)的用法,就像这样(如代码中所述):
import React, { useEffect, useRef, useState } from 'react';
import {
Button,
Dimensions,
StyleSheet,
View,
} from 'react-native';
import { SignalingChannel } from './SignalingChannel';
import { mediaDevices, MediaStream, RTCPeerConnection, RTCView } from "react-native-webrtc";
import { config } from './config';
const STREAM_ID = "170714163152216487974907";
export const Publisher = () => {
//...
const peerConnection = useRef<RTCPeerConnection>()
peerConnection.current = new RTCPeerConnection({
iceServers: []
})
peerConnection.current?.addStream(localStreamRef.current); //WHY THE "?" AFTER 'peerConnection.current'...?
peerConnection.current.onsignalingstatechange = () => console.log(peerConnection.current?.signalingState) //WHY THE "?" AFTER 'peerConnection.current'...?
peerConnection.current.onicecandidateerror = console.log
peerConnection.current.onicecandidate = (event) => {
const candidate = event.candidate;
if (candidate && signalingChannel.current?.isChannelOpen()) { //WHY THE "?" AFTER 'signalingChannel.current'...?
signalingChannel.current?.sendJSON({ //WHY THE "?" AFTER 'signalingChannel.current'...?
command: "takeCandidate",
streamId: STREAM_ID,
label: candidate.sdpMLineIndex.toString(),
id: candidate.sdpMid,
candidate: candidate.candidate,
})
}
}
const offer = await peerConnection.current.createOffer();
await peerConnection.current.setLocalDescription(offer);
//...
};
我试图找到有关这些问号的用途的信息,但没有成功。 'useRef' 似乎也接受上述代码中的扩展,例如“peerConnection.current.createOffer();”或“signalingChannel.current?.isChannelOpen()”...在我使用的关于 'useRef' 挂钩的文档中也没有提到。欢迎提供有关这些字符和用法的任何信息。
看起来你的例子不需要 ?.
,它是 optional chaining,还有一个,请将你的结构添加到 ref
const peerConnection = useRef<RTCPeerConnection>(
new RTCPeerConnection({
iceServers: []
})
);
因为在你的例子中你每次都创建一个实例 运行
useRef
作用是保存对“PeerConnection”组件的引用,并将其属性和方法(函数)公开给“peerConnection.current”。
´useRef´ 在组件重新渲染周期中保留其值。在某些 worst-case 场景中,“useRef”持有引用的子组件不应挂载,您无法访问其成员方法和属性。
可选的链接运算符 (?) 通过避免在未公开时调用组件方法或属性来避免代码崩溃。
我学习了一些关于在 React Native 函数中使用 'useRef' 钩子的知识。在检查我在 Internet 上找到的一些代码时......我看到了包括问号(“?”)的用法,就像这样(如代码中所述):
import React, { useEffect, useRef, useState } from 'react';
import {
Button,
Dimensions,
StyleSheet,
View,
} from 'react-native';
import { SignalingChannel } from './SignalingChannel';
import { mediaDevices, MediaStream, RTCPeerConnection, RTCView } from "react-native-webrtc";
import { config } from './config';
const STREAM_ID = "170714163152216487974907";
export const Publisher = () => {
//...
const peerConnection = useRef<RTCPeerConnection>()
peerConnection.current = new RTCPeerConnection({
iceServers: []
})
peerConnection.current?.addStream(localStreamRef.current); //WHY THE "?" AFTER 'peerConnection.current'...?
peerConnection.current.onsignalingstatechange = () => console.log(peerConnection.current?.signalingState) //WHY THE "?" AFTER 'peerConnection.current'...?
peerConnection.current.onicecandidateerror = console.log
peerConnection.current.onicecandidate = (event) => {
const candidate = event.candidate;
if (candidate && signalingChannel.current?.isChannelOpen()) { //WHY THE "?" AFTER 'signalingChannel.current'...?
signalingChannel.current?.sendJSON({ //WHY THE "?" AFTER 'signalingChannel.current'...?
command: "takeCandidate",
streamId: STREAM_ID,
label: candidate.sdpMLineIndex.toString(),
id: candidate.sdpMid,
candidate: candidate.candidate,
})
}
}
const offer = await peerConnection.current.createOffer();
await peerConnection.current.setLocalDescription(offer);
//...
};
我试图找到有关这些问号的用途的信息,但没有成功。 'useRef' 似乎也接受上述代码中的扩展,例如“peerConnection.current.createOffer();”或“signalingChannel.current?.isChannelOpen()”...在我使用的关于 'useRef' 挂钩的文档中也没有提到。欢迎提供有关这些字符和用法的任何信息。
看起来你的例子不需要 ?.
,它是 optional chaining,还有一个,请将你的结构添加到 ref
const peerConnection = useRef<RTCPeerConnection>(
new RTCPeerConnection({
iceServers: []
})
);
因为在你的例子中你每次都创建一个实例 运行
useRef
作用是保存对“PeerConnection”组件的引用,并将其属性和方法(函数)公开给“peerConnection.current”。
´useRef´ 在组件重新渲染周期中保留其值。在某些 worst-case 场景中,“useRef”持有引用的子组件不应挂载,您无法访问其成员方法和属性。
可选的链接运算符 (?) 通过避免在未公开时调用组件方法或属性来避免代码崩溃。