我在我的redux存储中存储了一个引用,并使用mapStateToProps公开了需要访问它的组件的引用。
存储的ref如下所示:
ref={node => this.myRefToBePutInReduxGlobalStore = node}
此引用的正确propType是什么?
如果您想要输入仅需要本机DOM元素(例如adiv
或an)的引用input
,则正确的定义如下:
refProp: PropTypes.oneOfType([
// Either a function
PropTypes.func,
// Or the instance of a DOM native element (see the note about SSR)
PropTypes.shape({ current: PropTypes.instanceOf(Element) })
])
在OP问题的示例中,不是需要声明ref
prop类型,而是由ref指向的东西,它将使用redux从redux传递mapStateToProps
。DOM元素的道具类型为:(myRefToBePutInReduxGlobalStore: PropTypes.instanceOf(Element)
如果它是DOM元素)。虽然,我会:
myElementToBePutInReduxGlobalStore
(元素不是引用)问:React中引用的正确原型是什么?
用例示例:
function FancyInput({ inputRef }) {
return (
<div className="fancy">
Fancy input
<input ref={inputRef} />
</div>
)
}
FancyInput.propTypes = {
inputRef: ??? // What is the correct prop type here?
}
function App(props) {
const inputRef = React.useRef()
useLayoutEffect(function focusWhenStuffChange() {
inputRef.current?.focus()
}, [props.stuff])
return <FancyInput inputRef={inputRef} />
}
如今,react中存在两种引用:
{ current: [something] }
,通常由React.createRef()
助手或React.useRef()
钩子创建 [something]
其作为参数接收(如OP示例中的一个)注意:从历史上看,您也可以使用字符串ref,但是 它被认为是旧式的,因此会从react中删除
第二项是很简单,需要以下道具类型:PropTypes.func
。
第一个选项不太明显,因为您可能要指定ref指向的元素的类型。
ref
可以指向DOM元素以外的其他内容。
如果要完全灵活:
refProp: PropTypes.oneOfType([
PropTypes.func,
PropTypes.shape({ current: PropTypes.any })
])
上面只是强制了带有current
属性的对象ref的形状。对于任何类型的参考,它都将始终工作。出于使用prop类型的目的(这是 在开发时
发现任何不一致之处的一种方式),这可能就足够了。具有shape的对象并传递给prop 似乎 不太可能 不是 实际的引用。{ current: [any] }``refToForward
__
但是 ,您可能希望声明您的组件不希望 任何 类型的引用,而只是希望某种类型,只要它需要该引用即可。
我已经设置了一个沙箱,展示了几种声明ref的不同方法,甚至包括一些非常规的方法,然后使用许多prop类型对其进行测试。
你可以在这里找到它
。
如果只希望引用指向本机输入元素,而不是 任何 HTML Element
:
refProp: PropTypes.oneOfType([
PropTypes.func,
PropTypes.shape({ current: PropTypes.instanceOf(HTMLInputElement) })
])
如果只希望引用指向React类组件:
refProp: PropTypes.oneOfType([
PropTypes.func,
PropTypes.shape({ current: PropTypes.instanceOf(Component) })
])
如果只希望引用指向功能组件的refuseImperativeHandle
公开一些公共方法:
refProp: PropTypes.oneOfType([
PropTypes.func,
PropTypes.shape({ current: PropTypes.object })
])
注意:上面的prop类型很有趣,因为它还涵盖了react组件和本机DOM元素,因为它们都继承了基本的javascriptObject
没有一种好的方法可以为引用声明prop类型,这取决于用法。
如果您的参考指向非常明确的东西,那么值得添加特定的道具类型。否则,仅检查一般形状就足够了。
如果您的代码必须在服务器上运行,除非您已经使用polyfill DOM环境,否则NodeJS
Element
中将包含任何其他客户端类型undefined
。您可以使用以下填充程序来支持它:
Element = typeof Element === 'undefined' ? function(){} : Element
以下React Docs页面提供了有关如何使用ref的更多见解,包括对象和回调,以及如何使用useRef
钩子
感谢@Rahul Sagore,@ Ferenk Kamra,@ svnm和@Kamuela Franco来更新答案
问题内容: 我正在尝试使用一个使用大量jQuery的Layout / Template的项目。 我已经学会了将模板与ReactJS Project集成在一起,但是,我正在寻找一种可以完全替代jQuery的解决方案。 我的解决方案之一是在内部使用jQuery函数或React函数。 这种方法正确吗?这是正确的方法吗? 我在下面附上一个小例子: 这是我的职能。 问题答案: 这种方法正确吗?这是正确的方法
问题内容: 我一直在弄乱JSON一段时间,只是将其作为文本推出,它并没有伤害任何人(据我所知),但是我想开始做正确的事情。 我见过 这么 多所谓的“标准”为JSON内容类型: 但是哪一个是正确的,还是最好的?我发现在它们之间存在安全性和浏览器支持问题。 我知道有一个类似的问题, [如果RESTAPI返回JSON,则为哪种MIME类型?,但我想要一个更有针对性的答案。 问题答案: 对于JSON文本:
处理计时器时正确的类型是什么?我试过和
问题内容: 我最近从Angular转到了ReactJs。我正在使用jQuery进行API调用。我有一个API,该API返回要打印在列表中的随机用户列表。 我不确定如何编写我的API调用。最佳做法是什么? 我尝试了以下操作,但未得到任何输出。如果需要,我愿意实现替代API库。 下面是我的代码: 问题答案: 在这种情况下,您可以在中进行ajax调用,然后进行更新
问题内容: 我已经在一些地方看到过使用它,还不能完全知道它的用途。 https://github.com/andrewvc/node-paperboy/blob/master/lib/paperboy.js#L24 https://github.com/substack/node-browserify/blob/master/index.js#L95 Node.js 的主要/正确用例是什么?文档基
问题内容: 可能重复: 在JavaScript中使用“原型”还是“this”?所以我对JS中OOP的想法有些陌生。 这两个下面的代码片段有什么区别: 他们俩都做同一件事,所以有什么区别呢? 问题答案: 使用原型可以更快地创建对象,因为不必在每次创建新对象时都重新创建该功能。 执行此操作时: 每次创建动物时,都会从头创建该函数。但是当你这样做 不必每次都重新创建该函数;它存在于原型中的一处。所以,当