当前位置: 首页 > 知识库问答 >
问题:

如何使用诸如Redux和ReactJS之类的声明式/函数式库处理焦点?

爱花蜂
2023-03-14

在查看其他开发人员在使用Redux时处理输入焦点的方式时,我遇到了一些关于ReactJS组件的通用指南,如下面的。然而,我担心的是focus()函数是必需的,我可以看到在多个组件为焦点而争吵时可能出现奇怪的行为。有没有一种处理焦点问题的方法?是否有人在使用redux和react进行实用主义的焦点设置?如果是,您使用什么技术?

相关的:

  • 如何设置Elm元素的焦点?
  • 在purescript卤素中创建后自动聚焦输入元素
  • https://github.com/cyclejs/cycle-core/issues/153

共有1个答案

孙泉
2023-03-14

我的方法是使用ref回调,这是一种元素的onRender完整。在那个回调中,我可以聚焦(有条件地,如果需要的话),并获得未来聚焦的参考。

如果在操作运行后有条件地呈现输入,那么ref回调应该触发一个焦点,因为在调用操作后ref还不存在,但只有在呈现完成后才存在。处理componentdiddupdate之类的focus似乎一团糟。

// Composer.jsx -- contains an input that will need to be focused somewhere else

class Composer extends Component {
  render() {
    return <input type="text" ref="input" />
  }

  // exposed as a public method
  focus() {
    this.refs.input.focus()
  }
}

// App.jsx

@connect(
  state => ({ isComposing: state.isComposing }),
  ...
)
class App extends Component {
  render() {
    const { isComposing } = this.props // or props, doesn't matter
    return (
      <div>
        <button onClick={::this._onCompose}>Compose</button>
        {isComposing ? <Composer ref={c => {
          this._composer = c
          this._composer && this._composer.focus() // issue initial focus
        }} /> : null}
      </div>
    )
  }

  _onCompose() {
    this.props.startComposing() // fire an action that changes state.isComposing

    // the first time the action dispatches, this._composer is still null, so the ref takes care of the focus. After the render, the ref remains so it can be accessed:

    this._composer && this._composer.focus() // focus if ref already exists
  }
}

为什么不autoFocusisfocusedprop?

由于HTMLInputElementvalue作为一个道具,但将focus()作为一种方法——而不是isFocusedprop——我会继续使用方法来处理它isFocused可以获取一个值,但是如果用户从输入中模糊,该值会发生什么变化?它将不同步。此外,如注释中所述,autoFocus可能与多个组件冲突

那么如何在道具和方法之间取舍呢?

在大多数情况下,道具就是答案。方法只能用于“开火并忘记”事件,例如当新消息出现时聊天中的scrollToBottomScrollToView等。这些是商店不关心的一次性行为,用户可以通过交互进行更改,因此布尔属性不适合。对于所有其他的事情,我会用道具。

这里有一个jsbin:

http://jsbin.com/waholo/edit?html, js,输出

 类似资料:
  • 我正在使用react router和react router redux处理我页面上的导航。我需要在组件内以编程方式更改url。我试着用这个方法:历史。推送实现这一点,但此方法只是更改url,与此url关联的组件不会更新。此应用程序是带有分页的简单列表,因此当我切换到下一页时,url会更改为例如/posts/1到/posts/2,但视图不会更新。我认为这应该是这样的: 用户单击分页项并单击处理程序

  • 问题内容: 有以下代码: 显然,的调用以某种方式改变了类的属性和行为。 这是怎么发生的?如何在代码中使用这种方法? 示例代码是zope.interface模块的一部分。 问题答案: 详细的“会发生什么” 该函数检查框架堆栈并更改构造类的名称空间(python )。python语句中的所有内容都在该命名空间中执行,结果形成类主体。 该函数为类命名空间添加了额外的值,其中包含一些数据(已传递给该函数的

  • 声明性映射样式是SQLAlchemy使用的主要映射样式。参见章节 声明性映射 对于最高层的介绍。 具有声明性的表配置 声明性表格 访问表和元数据 声明性表配置 具有声明性表的显式架构名称 添加新列 带命令表的声明性(又称混合声明性) 用反射表声明性地映射 使用DeferredReflection 使用自动映射 具有声明性的映射器配置 使用声明性定义映射属性 具有声明性的映射器配置选项 其他声明性映

  • 问题内容: 在我的一个项目中,我有一个管理多个客户(或客户,如果您愿意的话)的应用程序。对于他们每个人,我在数据库上都有一个专用的架构。但是,应用程序一次只处理一个客户端,即,用户必须从应用程序中的一个客户端切换到另一个客户端(在运行时,不重新启动应用程序),以便从该新客户端访问数据。 您将如何管理此类项目的连接以及持久层? 我想为此使用hibernate。在处理几个数据库/模式时,我必须特别注意

  • 有时一些业务逻辑的发生你每次都想重试它。最经典的例子就是远程调用,为了这个目的Spring Batch提供了一个Aop拦截器用来封装一个方法调用RetryOperations 。RetryOperationsInterceptor依据RetryPolicy 提供的RepeatTemplate 执行拦截方法和重试失败。 下面是一个示例使用Spring AOP命名空间的声明式迭代重复一个服务调用的一个

  • 函数是JavaScript中的一等对象,这意味着可以把函数像其它值一样传递。 一个常见的用法是把匿名函数作为回调函数传递到异步函数中。 函数声明 function foo() {} 上面的方法会在执行前被 解析(hoisted),因此它存在于当前上下文的任意一个地方, 即使在函数定义体的上面被调用也是对的。 foo(); // 正常运行,因为foo在代码运行前已经被创建 function foo