如何在反应原生的功能组件中使用 forwardRef?

Posted

技术标签:

【中文标题】如何在反应原生的功能组件中使用 forwardRef?【英文标题】:How can I use forwardRef in functional component in react native? 【发布时间】:2021-03-09 20:57:51 【问题描述】:

我制作了以下屏幕,其中每个标签 + 输入组合都位于子组件内。当我单击保存 (salvar) 时,我想检查每个组件的 ref 以查看它是否将“isInvalid”变量设置为 true,然后将边框涂成红色并显示错误消息。这意味着该字段是必需的,等等。

我尝试在父组件中创建一个 ref,如下所示:

export default function DiaryExam( navigation ) 

let examNameRef =  useRef();

return (
    <Page type="static" title='Avaliação' subtitle='Editar'>
            <FormInput ref=examNameRef inputType="text" title="Nome da avaliação" value=name setValue=setName required />
            //I'll add the other refs below later
            <FormInput inputType="text" title="Código" value=code setValue=setCode maxLength=8 required/>
            <FormInput inputType="number" title="Nota máxima" value=maxGrade setValue=setMaxGrade />
            <FormInput inputType="number" title="Peso" value=weight setValue=setWeight required />
            <FormInput inputType="date" title="Data de Início" value=startDate setValue=setStartDate />
            <FormInput inputType="date" title="Data de Fim" value=endDate setValue=setEndDate />
            <FormInput inputType="switch" title="Ignorar na Fórmula" value=ignoreFormula setValue=setIgnoreFormula />
            <Button style=[styles.button, ] textStyle=styles.buttonText title='Salvar' onPress=() => saveExam() requestFeedback />
    </Page>
);

在子组件中我有这样的东西(除其他外):

export default function FormInput ( inputType, title, value, setValue, required, maxLength, ref ) 

return (
    <View>
        (inputType === 'text' || inputType === 'number') && (
            <View>
                <Text ref=ref style=[styles.fieldValue,  borderColor: requiredValidationError ? 'red' : 'grey' ]>value</Text>
                <Text style=[ alignSelf: 'flex-end', backgroundColor: 'white', color: requiredValidationError ? 'red' : 'grey' ]>requiredValidationError? 'Campo obrigatório' : ''</Text>
            </View>
        )
        </View>
)

如果 'required' 属性为真,我需要查看 'value' 变量是否为 length === 0,然后设置 setRequiredValidationError(true) 以便相应地更改布局。

但我得到的只是控制台中的以下错误:

[Tue Mar 09 2021 17:21:48.858]  ERROR    Warning: Function components cannot be given refs. Attempts to access this ref will fail. Did you mean to use React.forwardRef()?

我已经用谷歌搜索了 react native forwardRef,但所有示例和文档都是针对传统 React 的,或者它们使用类组件,而我没有尝试过任何工作。我该怎么做?

【问题讨论】:

【参考方案1】:

根据警告,您需要使用React.forwardRef。你可以这样做:

const FormInput = React.forwardRef(( 
    inputType, 
    title, 
    value,
    setValue, 
    required, 
    maxLength
, ref) => 
    return (
        (inputType === 'text' || inputType === 'number') && (
            <View>
                <Text ref=ref style=[styles.fieldValue,  borderColor: requiredValidationError ? 'red' : 'grey' ]>value</Text>
                <Text style=[ alignSelf: 'flex-end', backgroundColor: 'white', color: requiredValidationError ? 'red' : 'grey' ]>requiredValidationError? 'Campo obrigatório' : ''</Text>
            </View>
        )
    )

更多信息在React doc,它使用了功能组件。

【讨论】:

成功了,你。我已经尝试过这种方式,但我想我是在尝试使用 export default function FormInput = React.forwardRef 而不是 const FormInput = React.forwardRef

以上是关于如何在反应原生的功能组件中使用 forwardRef?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift 反应原生自定义 UI 组件:如何在事件中访问 reactTag

反应原生如何检查组件当前是不是显示在屏幕中

如何在反应原生的子组件上重新渲染父组件?

如何调用另一个文件中的组件?反应原生

当它被包装在提供者组件中时,如何使用 mocha + 酶 + chai 测试反应原生组件

在自定义组件中反应原生访问 refs