如何在 React Native 中将 TextInput 与数组中未知长度的项目集中在一起?数组中可能有更多或更少的项目来自数据库

Posted

技术标签:

【中文标题】如何在 React Native 中将 TextInput 与数组中未知长度的项目集中在一起?数组中可能有更多或更少的项目来自数据库【英文标题】:How to focus TextInput with unknown length of items in an array in React Native? There may be more or less items in the array coming from the database 【发布时间】:2021-10-23 13:28:37 【问题描述】:

基本上我已经完成了对 TextInput 的关注,而项目可能被添加到购物车或来自数据库。我正在使用 useRef 挂钩,但是当我删除或添加某些项目时,我收到一些错误,指出当我在购物车中删除或添加一些项目时渲染更多而渲染更少。

这是有五个项目的 cartItems 数组。

[
    
        "isAddedToCart": true,
        "product_id": "1",
        "product_name": "PIN 36MM X 18IN",
        "quantity": 0,
        "unit": undefined
    ,
    
        "isAddedToCart": true,
        "product_id": "2",
        "product_name": "APIN 42MM X 24IN",
        "quantity": 0,
        "unit": undefined
    , 
        "isAddedToCart": true,
        "product_id": "3",
        "product_name": "PIN 24MM X 10IN",
        "quantity": 0,
        "unit": undefined
    , 
        "isAddedToCart": true,
        "product_id": "4",
        "product_name": "RAKAB 18MM X 24IN",
        "quantity": 0,
        "unit": "2"
    
]

这是我创建的辅助函数。


    export const inputRef = (cartItems) => 
    const inputRefs = []
    cartItems.map((item, index) => 
        if(index != (cartItems.length-1))
            inputRefs[index] = useRef(null);
                
    )

    return inputRefs;
    

这是我的文本输入

    <TextInput
    placeholder="Qty"
    placeholderTextColor="#676767"
    style=InputStyleWithoutBorder
    onChangeText=(quantity) => inputQuantity(item.product_id, quantity, defaultUnit.default)
    keyboardType="numeric"
    value=item.quantity
    returnKeyType=inputRefs.length == index ? "done" : "next"
    blurOnSubmit=inputRefs.length == index ? true : false
    ref=index == 0 ? null : inputRefs[index-1]
    onSubmitEditing=() =>  
            index == 0 || cartItems.length != index+1 ? inputRefs[index].current.focus() :null
            inputQuantity(item.product_id, item.quantity)
            
    
    />

在我从购物车中添加或删除一些商品之前,这一切正常。 对焦效果很好。

This is the item which can be deleted or can add later from the list of items

This is the error when I delete items in the cart

This is the error when I add items in the cart

【问题讨论】:

你能把代码粘贴到你定义你的钩子的地方吗? 这是 AddOrderScreen.js 链接ctxt.io/2/AACgu95HFA 这是 Helper.js 链接ctxt.io/2/AACgh5Z9Fg 另外,如果这不是好方法,请提及如何通过增加或减少 TextInput 的数量来关注动态文本输入。我正在等待解决方案。 【参考方案1】:

你能试试这个解决方案吗:

export const inputRef = (cartItems) => 
  const inputRefs = useRef([])
  inputRefs.current = cartItems.map((item, index) => 
     return inputRefs.current[i] ?? createRef(null);
  )

  return inputRefs;

【讨论】:

我在上面编辑了这个导出的解决方案 const inputRef = (cartItems) => const inputRefs = useRef([]) inputRefs.current = cartItems.map((item, index) => return inputRefs .current[index] ?? createRef(null); ) return inputRefs;并且它显示无法读取未定义的属性“当前”,下一个键现在也不起作用。 这工作正常 export const inputRef = (cartItems) => const inputRefs = [] cartItems.map((item, index) => if(index != (cartItems.length-1 )) inputRefs[index] = createRef(null); ) return inputRefs; 我只是在旧解决方案中使用 createRef,它工作正常,请解释一下它是如何工作的,我正在尝试理解解决方案。 createRef 总是会创建一个新的 ref,useRef 只会创建一个 ref 并且在每次进一步调用之后返回之前创建的 ref。【参考方案2】:
export const inputRef = (cartItems) => 
    const inputRefs = []
    cartItems.map((item, index) => 
        if(index != (cartItems.length-1))
            inputRefs[index] = createRef(null);
                
    )
    return inputRefs;


This solution is working fine.

【讨论】:

请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。

以上是关于如何在 React Native 中将 TextInput 与数组中未知长度的项目集中在一起?数组中可能有更多或更少的项目来自数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何在 react-native 函数组件中将获取数据设置为文本字段

如何在React native中将屏幕分为三个具有不同文本内容的部分

我们如何在React Native中将生产的APK大小减少70%?

如何在 React Native 中将 UInt16 或字节转换为心跳率

如何在 React Native 中将整个选择更改为单个选择?

如何在 React Native 项目中将 JS 库导入打字稿