标签: controlled-component

React:警告,组件正在将不受控制的输入更改为受控制

我在我的 React 应用程序中使用Google 地图地址自动完成功能。它的工作原理是连接到输入元素、观察变化并提供下拉位置选择。

相关代码:

<InputGroup hasValidation className="mb-3">
    <FormControl id="autocomplete"/>
</InputGroup>
Run Code Online (Sandbox Code Playgroud)
useEffect(() => {
        
    // only specify the fields we need, to minimize billing
    const options = {"fields": ["address_components"]}

    const autocompleteElement = document.getElementById("autocomplete")

    if(autocompleteElement) {

        autocomplete.current = new google.maps.places.Autocomplete(autocompleteElement, options);
            
        const listener = autocomplete.current.addListener("place_changed", placeSelected);
        return function cleanUp() {
            google.maps.event.clearInstanceListeners(listener);
        }
    } else {
        // nothing to do yet
        return;
    }
});
Run Code Online (Sandbox Code Playgroud)

但是,我在浏览器控制台中收到警告

Warning: A component is changing an uncontrolled input to be controlled. This is likely …

javascript google-maps reactjs controlled-component

11
推荐指数
3
解决办法
3万
查看次数

如何阻止光标跳到输入的末尾

我有一个受控的 React 输入组件,我正在格式化输入,如 onChange 代码所示。

<input type="TEL" id="applicantCellPhone" onChange={this.formatPhone} name="applicant.cellPhone" value={this.state["applicant.cellPhone"]}/>
Run Code Online (Sandbox Code Playgroud)

然后我的 formatPhone 功能是这样的

formatPhone(changeEvent) {
let val = changeEvent.target.value;
let r = /(\D+)/g,
  first3 = "",
  next3 = "",
  last4 = "";
val = val.replace(r, "");
if (val.length > 0) {
  first3 = val.substr(0, 3);
  next3 = val.substr(3, 3);
  last4 = val.substr(6, 4);
  if (val.length > 6) {
    this.setState({ [changeEvent.target.name]: first3 + "-" + next3 + "-" + last4 });
  } else if (val.length > 3) {
    this.setState({ [changeEvent.target.name]: …
Run Code Online (Sandbox Code Playgroud)

javascript cursor-position reactjs controlled-component

9
推荐指数
2
解决办法
5365
查看次数

React 警告 MUI:组件在初始化后正在更改不受控制的 SwitchBase 的默认检查状态

我正在尝试使用默认检查值渲染 mui Switch 组件。但它不起作用,我收到警告。

MUI: A component is changing the default checked state of an uncontrolled SwitchBase after being initialized. To suppress this warning opt to use a controlled SwitchBase. 3 useControlled.js:27
Run Code Online (Sandbox Code Playgroud)

我也尝试过设置checked属性,onChange但仍然不起作用!我不明白我在这里做错了什么。

{details.schedule.days.map((d) => (
                <StyledTableRow>
                  <TableCell>
                    <Typography variant="subtitle1" fontWeight="bold">
                      {d.day}
                    </Typography>
                  </TableCell>
                  <TableCell>
                    <FormControlLabel
                      control={
                        <Switch
                          onChange={(e, checked) => {
                            setDetails((p) => {
                              let prev = { ...p };
                              prev.schedule?.days?.find(
                                (el) =>
                                  el.day === d.day &&
                                  (d.open = e.target.checked)
                              );
                              return prev;
                            });
                          }} …
Run Code Online (Sandbox Code Playgroud)

reactjs material-ui controlled-component

9
推荐指数
2
解决办法
2万
查看次数

Lit-elements,编写受控组件的惯用方式

我正在通过@open-wc使用lit-elements,目前正在尝试编写一组嵌套的组件,其中内部组件是一个输入字段,并且某些祖先组件必须支持一些任意重写规则,例如“不允许输入数字” '。

我想弄清楚的是使用 lit-elements 构建它的正确方法什么。在React 中,我会使用一个“受控组件”,在这里可以轻松地强制所有组件提交给根组件属性。

下面的示例是我使用 Lit-Elements 提出的。有没有更好的方法来做到这一点

请注意; 因为我想忽略一些字符,所以挑战变得稍微困难​​一些。如果没有e.target.value = this.value;at 级别 5,输入 elmement 将与忽略字符上的组件状态不同。我希望整个组件链正确同步,因此以标头标签为例。

export class Level1 extends LitElement {
  static get properties() {
    return {
      value: { type: String }
    };
  }

  render() {
    return html`
      <div>
        <h1>${this.value}</h1>
        <level-2 value=${this.value} @input-changed=${this.onInput}></level-2>
      </div>`;
  }

  onInput(e) {
    this.value = e.detail.value.replace(/\d/g, ''); 
  }
}

... …
Run Code Online (Sandbox Code Playgroud)

javascript web-component lit-element controlled-component

5
推荐指数
1
解决办法
643
查看次数

使用链接 React-Bootstrap 控制轮播

我正在尝试从导航栏中的链接控制轮播。我现在拥有的是 HomePage 组件(NavBar 和 Carousel 的父组件)中的 click 方法,它根据在 NavBar 中单击的链接更新当前选定索引的状态。我对如何让 Carousel 收听索引状态并在按下 Link 后移动幻灯片的方法一无所知。当我最初设置 activeIndex 时,我无法让它正确收听作为道具传递的索引,并且 onSelect 处理程序也基本上什么都不做。

更新:HomePage => 刚刚向状态添加了方向以反映下面轮播中更新 v2 的变化。

class HomePage extends Component {
    constructor(props){
        super(props);
        this.state = {index: '0', direction: null};
    }

    handleclick = (i) => {
        this.setState({direction: (this.state.index>i) ? 'prev':'next', index: i});
    }

    render() {
        return (
            <Container className='containerCustom d-flex h-100 w-100' fluid>
                <Row className='fullscreen-bg h-100 w-100'>
                    <video loop autoPlay className='fullscreen-bg_video w-100 h-100'>   
                        <source src={background} type='video/mp4'/>
                    </video>
                </Row>
                <Row className='flex-fill w-100 navrow' noGutters>
                    <Col …
Run Code Online (Sandbox Code Playgroud)

javascript reactjs react-bootstrap react-props controlled-component

5
推荐指数
0
解决办法
976
查看次数

如何查找用户何时停止输入受控组件?

我试图捕捉用户停止输入受控输入的那一刻。它在不受控制的组件内部发生得很顺利。

当我尝试使用 时setTimeout,只有最后一个字符作为输入,其余的都没有输入。我不确定为什么会发生

import React, { Component } from "react";
import ReactDOM from "react-dom";
import {connect} from 'react-redux';

import "./styles.css";

class Main extends Component{
  state={}

  timeout = null;

  onChange = e => {
    this.props.handleInputChange(e.target.value);
  }

  render(){
    return (
      <div className="Main">
        <input type='text' value={this.props.val} onChange={this.onChange}/>
      </div>
    );
  }
}

const mapStateToProps = state => {
  val: state.reducer.val
}

const mapDispatchToProps = dispatch => {
  handleInputChange: (val)=>dispatch(reducer.changeInput(val))
}

connect(mapStateToProps,mapDispatchToProps)(Main);

Run Code Online (Sandbox Code Playgroud)

当用户停止输入时,它应该调度changeInput动作

forms input reactjs react-redux controlled-component

2
推荐指数
1
解决办法
2766
查看次数

如何在React中正确更新&lt;select multiple ...&gt;?

在 React 应用程序中,您应该控制<select>. 只需一个选择就可以非常简单:

const ExampleSelect = () => {
  const [value, setValue] = React.useState()
  return (
    <select
      value={value}
      onChange={(e) => setValue(e.currentTarget.value)}
    >
      <option value='foo'>Foo</option>
      <option value='bar'>Bar</option>
      <option value='baz'>Baz</option>
    </select>
  )
}
Run Code Online (Sandbox Code Playgroud)

但是当你将multipleprop 添加到 a 中时<select>,事情就会变得奇怪。传递给onChange它的函数会迭代选项并根据哪些选项采取行动,这些选项似乎option.selected === true只在桌面上工作——在 iOS 上的 Safari 中,选择multiple === true似乎无法控制。

我觉得这是一个非常基本的问题,但我找不到任何相关内容。我不想安装带有预样式组件的整个库,只是为了能够在<select>React 应用程序内部选择多个选项。

以下是我尝试过的一些 onChange 函数:

type Setter = React.Dispatch<React.SetStateAction<string[] | undefined>>
type SelectChange = React.ChangeEvent<HTMLSelectElement>

export const handleMultiSelectChange = <S extends Function …
Run Code Online (Sandbox Code Playgroud)

select jsx reactjs dropdown controlled-component

2
推荐指数
1
解决办法
3839
查看次数

React - 未捕获类型错误:无法读取未定义的属性“toLowerCase”

在输入字段中输入颜色名称后,当我提交表单时,出现错误:

TypeError:无法读取未定义(匿名函数)的属性“toLowerCase”C:/Users/HP/Documents/WDB/React/Practice/colors-app/src/NewPaletteForm.js:117

  114 |     //to check -> is 'palette name' unique
  115 |     ValidatorForm.addValidationRule("isPaletteNameUnique", value => {
  116 |         return palettes.every(
> 117 |             ({ paletteName }) => paletteName.toLowerCase() !== value.toLowerCase()
  118 | ^       );
  119 |     });
  120 | })
Run Code Online (Sandbox Code Playgroud)

App.js :(基于类的组件)

class App extends Component {
  constructor(props) {
    super(props);
    this.state = { palettes: seedColors };
    this.findPalette = this.findPalette.bind(this);
    this.savePalette = this.savePalette.bind(this);
  }
savePalette(newPalette) {
    this.setState({ palettes: [...this.state.palettes, newPalette] });
  }

  render() {
    return (
      <Switch>
        <Route
          exact …
Run Code Online (Sandbox Code Playgroud)

reactjs react-hooks controlled-component

2
推荐指数
1
解决办法
1万
查看次数

有没有办法在 React 中隐藏密码输入的值?

我有这个代码用于输入 type="password"

<input
  type="password"
  id="password"
  value={form.password}
  onChange={handlePasswordChange}
/>
Run Code Online (Sandbox Code Playgroud)

它有效,但我注意到,在开发者控制台“Elements”中,您实际上可以看到密码字段的值:

<input type="password" class="form-control undefined" value="qwerty">
Run Code Online (Sandbox Code Playgroud)

这样显示密码可以吗?有办法隐藏它吗?我应该使用非受控组件而不是受控组件吗?

passwords reactjs controlled-component

2
推荐指数
1
解决办法
3177
查看次数

组件正在将文本类型的受控输入更改为不受控制 - ReactJS

我有一个页面,我从服务器获取数据并为受控输入设置状态值。(例如,我有拥有的输入值this.state.name,我从服务器例如戴夫取名字,并将其设置在状态的名称,所以输入的值是戴夫。它的工作原理,但我与对象数组有问题

所以这就是状态

this.state = {
        ingredients: [{ ingredient: "", quantity: '' }],
        //other properties
   }
Run Code Online (Sandbox Code Playgroud)

这就是我如何使用 ingredients

{this.state.ingredients.map(({ ingredient, quantity }, index) => (


   <div key={index}>
        ingredient: <input value={ingredient} className="ingredientClass" type="text" autoComplete="off" placeholder="e.g: pepper" onChange={{e => this.update(index, "ingredient", e.target.value)} />
        quantity: <input value={quantity} autoComplete="off" type="text" placeholder="e.g: 1g" onChange={e => this.update(index, "quantity", e.target.value)} />
        <button onClick={this.BtnClick}>delete</button> <br />
       {this.state.errorFor === 'ingredientsfield' ? this.state.errmsg : null}
   </div>
))}
Run Code Online (Sandbox Code Playgroud)

但这会导致此错误:

警告:组件正在将文本类型的受控输入更改为不受控制。输入元素不应从受控切换到不受控制(反之亦然)。决定在组件的生命周期内使用受控或非受控输入元素。更多信息:link

为什么会这样?我该如何解决?

PS:我检查并成功从服务器获取成分

更新:onChange 事件的代码

update(index, key, value) {
    this.setState(({ …
Run Code Online (Sandbox Code Playgroud)

javascript arrays object reactjs controlled-component

1
推荐指数
1
解决办法
1142
查看次数