1

我有一个反应本机自定义输入组件,并且我成功地将其 ref 转发到父组件。现在,我还想参考孩子本身的输入,我该怎么做?

//my imports here

//my text field component
export const MyTextField = React.forwardRef((props, ref) => {

   const [inputValue, setValue] = useState('');

   const clearInput = () => {
      setValue("");
      //I want to get the input by ref here and apply "clear()" method on it
   }


   return (
      <View>
         <TextInput
            /*
             How can i also use this ref to refer to this textinput in The "clearInput" function above
             */
            ref={ref}
            value={inputValue}
            onChangeText={(value) => setValue(value)}
            {...props}
         />
         <IconButton
            icon="close-circle"
            onPress={clearInput}
         />
      </View>
   );
});

4

1 回答 1

3

本文通过Travis Waith-Mair示例展示了您想要做什么:https ://non-traditional.dev/how-to-use-the-forwarded-ref-in-react-1fb108f4e6af


编辑:

似乎链接文章的作者 Travis 也创建了相关代码的 npm 包:https ://www.npmjs.com/package/@bedrock-layout/use-forwarded-ref


这是一个带有示例的小吃:https ://snack.expo.io/@truetiem/use-forwardedref

如果你想在你的代码中实现它:

// Copy-Pasted the "useForwardedRef" from the linked article by "Travis Waith-Mair"
const useForwardedRef = (ref) =>{
   const innerRef = useRef(null);

   useEffect(() => {
     if (!ref) return;
     if (typeof ref === 'function') {
       ref(innerRef.current);
     } else {
       ref.current = innerRef.current;
     }
   });
 
   return innerRef;
}

export const MyTextField = React.forwardRef((props, ref) => {
   const forwardedRef = useForwardedRef(ref);
   const [inputValue, setValue] = useState('');

   const clearInput = () => {
      setValue("");
      
      // We can now access the ref with forwardedRef
      forwardedRef.current?.clean?.();
   }


   return (
      <View>
         <TextInput
            // We are passing the forwardedRef here
            ref={forwardedRef}
            value={inputValue}
            onChangeText={(value) => setValue(value)}
            {...props}
         />
         <IconButton
            icon="close-circle"
            onPress={clearInput}
         />
      </View>
   );
});

于 2021-07-17T17:33:42.683 回答