我在我的 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 …
我有一个受控的 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) 我正在尝试使用默认检查值渲染 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) 我正在通过@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) 我正在尝试从导航栏中的链接控制轮播。我现在拥有的是 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
我试图捕捉用户停止输入受控输入的那一刻。它在不受控制的组件内部发生得很顺利。
当我尝试使用 时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
动作
在 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)
但是当你将multiple
prop 添加到 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) 在输入字段中输入颜色名称后,当我提交表单时,出现错误:
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) 我有这个代码用于输入 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)
这样显示密码可以吗?有办法隐藏它吗?我应该使用非受控组件而不是受控组件吗?
我有一个页面,我从服务器获取数据并为受控输入设置状态值。(例如,我有拥有的输入值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) reactjs ×9
javascript ×5
arrays ×1
dropdown ×1
forms ×1
google-maps ×1
input ×1
jsx ×1
lit-element ×1
material-ui ×1
object ×1
passwords ×1
react-hooks ×1
react-props ×1
react-redux ×1
select ×1