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

TextField在键入Redux Reactjs时失去焦点

洪念
2023-03-14

我正在使用MaterialUI构建组件扩展的,其中我有一个文本字段列表。

我在redux中存储数据。

reduxState = {
    fieldName1:[
      {
          primaryText:"text1",
      },
      {
          primaryText:"text2"
      },
    ],
    fieldName2:[
      {
          primaryText:"text1"
      },
      {
          primaryText:"text2"
      },
    ]
}

每个Exapanded保留每个字段的文本字段

组件Exapanded如下所示

function Expanded(props) {
  const {onChange, title, list } = props

  const CustomPaper = withStyles({
     root:{
       color: blue
     }
  })(Paper)

  return (
    <ExpansionPanel>
      <ExpansionPanelSummary expandIcon={<ExpandMoreIcon />}>
        <Typography>{title}</Typography>
      </ExpansionPanelSummary>
      <ExpansionPanelDetails>
          <Grid container spacing={1} direction="row">
            {list.map((item,i) => 
              <CustomPaper key={i}>
                <TextInput label="Main Text" value={item.primaryText} xs={12} onChange={(value) => onChange(value, i, 'primaryText')}/>
              </CustomPaper >
            )} 
          </Grid>           
      </ExpansionPanelDetails>
    </ExpansionPanel>
  );
}

使用示例


            <Expanded
              title={`Add FieldName1`}
              list={reduxState.fieldName1}
              onChange={onChangeSectionInfo('fieldName')}
            />

键入时,onChangeSelectionInfo函数调用redux操作updateSection

    [formActionTypes.UPDATE_SECTION]: (state, action) => {
      //ex. field-FieldName, value-"text1Updated", index=0, element="primaryText"
      const { field, value, index, element } = action.payload;
     return {
        ...state,
        [field]: state[field].map((object, i) =>
          i === index ? { ...object, [element]: value } : object
        )
      };
    },

问题是我只能键入一个字符,然后它就会取消文本字段的焦点。是redux的问题吗,更新时间太长?

编辑:这里的解决方案没有帮助,我去掉了所有的循环,仍然不起作用


共有3个答案

赵雪峰
2023-03-14

所以问题实际上是我创建的Expanded组件中的CustomFood(我编辑了我的问题,在我没有显示我正在使用CustomFood之前,因为它对我来说并不重要)。当我从MaterialUI更改CustomFoodFood时,一切都正常。有什么想法为什么?

艾昊明
2023-03-14

每次在输入中键入字符时,都会调用onChange,它会更新道具,并且组件由道具组成,因此React会重新呈现它,这会使字段失去焦点。如果可以的话,尝试将事件处理程序更改为onBlur或其他东西。

当前事件链:

  1. 使用道具渲染组件
翁和正
2023-03-14

在每次重新渲染时,您都要重新创建CustomPaper,这将需要完全重新安装组件(CustomPaper),而不仅仅是重新渲染,这就是您失去焦点的原因。

移除组件外部的组件,不要在组件内部定义组件。

 类似资料:
  • 我遇到了一个奇怪的错误,我的搜索输入组件,它失去了对每个按键的关注,不知道为什么。 我还得到了一个

  • 在我的活动中,我有一个editText字段。当用户点击它时,editText获得焦点并出现键盘。现在,当用户按下手机上的硬件后退按钮时,键盘会消失,但光标仍保留在Edittext中,即它仍然具有焦点。当按下后退按钮时,是否有可能使EditText失去焦点?我尝试使用以下代码,但它不起作用:

  • 当将html输入与样式化组件一起使用并将值保存为react state with onChange时,组件似乎会在每次状态更改时重新呈现,并导致输入失去焦点。有没有办法防止输入失去焦点?为什么会发生这种情况?这里有一个例子。

  • 我正在编写文本输入,并在事件中调用,因此React重新呈现我的UI。问题是文本输入总是失去焦点,所以我需要为每个字母重新聚焦:D。

  • 在我下面的组件中,输入字段在键入字符后失去焦点。当使用Chrome的Inspector时,看起来整个表单都在重新呈现,而不仅仅是输入字段的value属性。 我没有从eslint或Chrome Inspector得到任何错误。 提交表单本身的工作方式与实际输入字段的工作方式相同,当表单位于渲染的返回中或作为单独的组件导入时,而不是按照下面的编码方式。 为什么会这样? 主页组件 文本输入组件 提交按钮

  • 问题内容: 我正在制作动态表格。一个有值的列表。每个值由一个字符串表示。 我的组件中有一个函数,可以向该字段添加新值。 值和按钮在我的HTML中这样显示。 一旦我在值的输入中写入一些文本,输入就会失去焦点。如果我在一个字段中添加了多个值,并且在一个输入值中写入了一个字符,则该输入将失去焦点,并且该字符将写入每个输入中。 问题答案: 当数组是原始类型(在您的情况下是数组)时,会发生这种情况。这可以通