Reactjs 在react native中动态(全局)设置焦点上的输入字段

Reactjs 在react native中动态(全局)设置焦点上的输入字段,reactjs,react-native,redux,Reactjs,React Native,Redux,我正在开发物联网/移动应用程序。目前,我有一个从我的物联网设备接收和解码异步包的代码。该设备连接天平等工具和其他设备。我需要将此物联网数据发送到输入字段 管理物联网的代码在后台运行,它从应用程序开始,并使用回调运行。它管理连接、重新连接,并对接收到的包数据设置回调。 例如,包数据可以包含单个值,如:10.34 此代码从应用程序开始 在主应用程序上,我有许多输入字段,数字和文本。当我收到来自IoT的包时,我想将其写入当前关注的字段 用户在应用程序中启动操作,有一个名为Weigth的字段 用户将注意

我正在开发物联网/移动应用程序。目前,我有一个从我的物联网设备接收和解码异步包的代码。该设备连接天平等工具和其他设备。我需要将此物联网数据发送到输入字段

管理物联网的代码在后台运行,它从应用程序开始,并使用回调运行。它管理连接、重新连接,并对接收到的包数据设置回调。 例如,包数据可以包含单个值,如:10.34 此代码从应用程序开始

在主应用程序上,我有许多输入字段,数字和文本。当我收到来自IoT的包时,我想将其写入当前关注的字段

  • 用户在应用程序中启动操作,有一个名为
    Weigth
    的字段
  • 用户将注意力集中在字段上
  • 用户按下与电子秤相连的外部物联网设备上的按钮
  • 该应用程序将数据(例如10.34千克)输入手机,并发出回调
  • 回调函数将10.34发送到
    权重的输入字段中
  • 举个例子。设想物联网设备是一个键盘,它的书写方式与屏幕键盘相同。但是固件是关闭的,它使用了一个低级的疯狂协议,不能转换成键盘

    额外的

    注入KeyboardEvent不起作用,出于安全原因,如果我们不知道在哪里,我们就不能注入。注入
    文档
    (根级别)将不起作用


    我的应用程序目前正在使用Redux(如果它对解决方案有帮助的话)

    您需要通过reducer进行一些全局数据管理:

    • 将一个对象添加到全局存储中,存储每个输入的值,并按其id进行索引(例如)
    • 在存储中添加另一个值以保存最后一个聚焦的输入id
    • 在每个输入中添加一个
      onFocus
      处理程序。无论何时触发,将id传递给reducer并将其保存在全局存储中
    • 当IoT操作发生时,修改最后一个聚焦输入的存储值
    • 如果需要让用户手动修改输入,请为每个输入添加一个
      onChange
      事件侦听器,并启动减速机来修改指定的输入值

    我宁愿创建一个
    CustomInput
    抽象组件来完成所有需要的普通工作,而不是修改所有输入渲染。

    您不能将
    CreateRef
    直接用于Redux或上下文API。您需要创建一些复杂的forwardRef,因此它被认为是一种糟糕的模式

    更好的解决方案是实现观察者模式

  • 物联网服务启动并具有观察者系统
  • 该字段被聚焦
    onFocus
    连接到观察者同步系统中
  • 当IoT更改值时,调用setValue将触发
    onFocus
    回调
  • 物联网的可观察模式。从教程中编辑,仅允许单个附加(不能使用IoT更新多个字段):

    /**
    *基于观察者模式的物联网
    *只允许一个订户,因为只应更新聚焦字段
    */
    设subscriberCb=null;
    const subscribeIoT=(notifyObserver)=>{
    subscriberCb=notifyObserver;
    };
    常量取消订阅=()=>{
    subscriberCb=null;
    };
    const updateIoTValue=(newValue)=>{
    console.log(newValue);
    if(subscriberCb!==null){
    console.log(“更新观察者”);
    下标cb(newValue);
    }
    }
    出口{
    订阅,
    取消订阅,
    更新值
    };
    
    onFocus
    附件:

    <TextInput type="text" value={value} onChangeText={setValue} onFocus={() => {
        console.log('Focused');
        subscribeIoT( newValue => setValue(newValue.toString()));
    }} />
    
    {
    console.log('Focused');
    subscribeIoT(newValue=>setValue(newValue.toString());
    }} />
    
    我正在使用Formik动态创建表单。因此,状态是在它内部处理的。我不确定我能那么容易地找到聚焦场的设置状态。我正在考虑使用另一种方法来保存某种“ref”或“C-like-pointer thingy”。有什么想法吗?我刚刚发现了福米克。看起来它有很多定制的方法,所以这取决于你如何使用它。例如,
    Formik.setFieldValue
    Formik.resetForm
    (使用
    nextState.values
    )看起来很适合您。