当元素的状态发生变化时,会触发onChange事件。许多使用GUI的语言都支持某种形式的更改事件。例如JavaScript和JavsScript库jQuery(带.change()函数)。
在这里,下面我给出了一个 React 项目的代码,我正在努力理解它是如何工作的。 main.jsx 文件代码 从“反应”导入反应; 从“react-dom/
我遇到的一个例子: 我最近遇到了以下例子: 激活(事件){ console.log(event.target.value); } 使成为() { 返回 ( 我遇到的一个例子: 我最近遇到了以下例子: activate(event) { console.log(event.target.value); } render() { return ( <div onChange={this.activate.bind(this)}> <input type="radio" value="yes" name="confirm"/> Yes <input type="radio" value="no" name="confirm"/> No </div> ) } 这允许将 onChange 处理程序应用于单选按钮的父 div,而不是应用于每个单独的单选按钮。 我对此的疑问: 是否有任何原因将 onChange 属性专门应用于一组单选按钮而不应用于其他表单元素组? 为什么不将所有表单字段放在单个 div 或表单元素中并且只有一个 onChange 属性? 这是ReactJS特有的,还是可以在基本的JavaScript中完成类似的事情? 1。是否有任何原因导致 onChange 属性专门应用于一组单选按钮而不应用于其他表单元素组? 不,没有理由不能将其应用于其他表单元素甚至 DOM 的根元素。所有事件都从根到目标(捕获阶段),然后回到根(冒泡阶段)。编写事件处理程序时必须牢记这一点。有关事件冒泡的更多信息,请参阅 this SO thread。 2。为什么不将所有表单字段放在单个 div 或表单元素中并且只有一个 onChange 属性? 对于普通 JS 来说,这通常是正确的。然而,React 实现了自己的事件系统,他们建议的方式似乎是创建一个事件监听器,然后将每个输入链接到它。 <form onSubmit={handleSubmit}> <input type="text" onChange={handleChange} /> <input type="text" onChange={handleChange} /> <input type="text" onChange={handleChange} /> </form> 无论是否使用事件冒泡,handleChange函数都会使用event.target.value,但React似乎更喜欢将函数显式附加到每个输入元素。 如果不这样做,当您尝试设置默认值时,通常会遇到警告: (默认值也是常见的混乱来源,更多信息此处) 这只是一个警告。此警告已成为 Github 存储库上大规模讨论的主题,更多讨论如下。 3.这是 ReactJS 特有的,还是可以在基本 JavaScript 中完成类似的操作? 如前所述,这不是特定于 React 的,它实际上更特定于 JS。 React 似乎对此不可知。他们似乎更喜欢您向每个输入元素添加 onChange 引用,而不是以这种方式使用冒泡。什么是正确的方法? 我不知道。我认为这取决于您更喜欢什么,或者情况需要什么。 在 Github 存储库上的大型讨论中,大多数人都会遇到警告,因为使用事件冒泡通常是在 vanilla JS 中鼓励作为“最佳实践”的方式。不过,也有声音说: 这是我的观点,但我想说这是相反的,这是一个坏主意。它依赖于 React 层次结构之外的冒泡。 评论链接 因此,取决于你问的是谁,使用事件冒泡可能会被认为违背了 React 思维的趋势。这将取决于您选择如何构建应用程序。 重要的是要注意,它没有没有真正的问题,一切都有效。无论您是否使用事件冒泡。在这个问题中,主要的抱怨似乎可以归结为这样一个事实:控制台上充满了警告,并且没有优雅的方法来关闭它们。最好的方法似乎是只为输入元素分配一个空函数。 我不是 React 专业人士,但我可以说几句话: 您可以在每种类型的输入上放置 onChange,它适用于选择、文本、复选框。 最好直接在输入本身上使用 onChange 或任何侦听器,为什么?因为在此函数中,您可以轻松地使用“事件”参数引用您的输入,如下所示: 函数handleChange(事件){ var value = event.target.value; } 如果你不这样做,你就必须参考正确的输入,这可能真的很混乱。 我知道的最短且效果很好: handleInputChange = ({ target: { name, value } }) => { this.setState({ [name]: value }) } 请记住: 您需要将 name="name" 属性添加到输入标签中, 您还需要有该州的通讯名称。 检查此片段并使用它添加更多文本字段(这很神奇): class SingleHandler extends React.Component { state = { title: '', description: '' } handleInputChange = ({target: { name, value }}) => { this.setState({ [name]: value }); } render() { return ( <div> <label htmlFor="title">title: {this.state.title}</label> <input type="text" name="title" value={this.state.title} onChange={this.handleInputChange} /> <label htmlFor="description">description: {this.state.description}</label> <input type="text" name="description" value={this.state.description} onChange={this.handleInputChange} /> </div> ); } } ReactDOM.render(<SingleHandler />, document.body); input, label { display: block; width: 80%; } <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 来源: https://reactjs.org/docs/forms.html(在这里您会找到一个也适用于不同类型输入的版本) https://medium.com/@tmkelly28/handling-multiple-form-inputs-in-react-c5eb83755d15(也很棒的资源) activate(event) { console.log(event.target.value); } render() { return ( <div> { ["yes","no"].map((item,i)=>( <> <input key={i} type="radio" value={item} name="confirm" onChange={(e)=>activate(e)}/> {item} </> )) } </div> ) } 您可以创建一个函数来呈现一种类型的输入框,包括任何 javascript“on”事件,例如输入类型文本: renderInputText(title, name){ return ( <div className="form-group"> <label>{title}</label> <input type="text" name={name} className="form-control" placeholder={"Enter " + title} value={this.state.detail[name]} onChange={this.onChangeHandler} onFocus={this.onChangeHandler}/> </div> ); } 然后你可以从你的 html 表单中调用它: <div class="form"> {this.renderInputText('Title', 'title')} {this.renderInputText('Name', 'name')} {this.renderInputText('Phone', 'phone')} etc... </div>
SwiftUI Picker:仅当用户更改选择器状态时运行代码
在 macOS Sonoma 上的 SwiftUI 应用程序中,我使用了多个 Picker 视图。这是一个例子: Picker("Berichtsart", 选择: $report.reportType) { ForEach(ReportType.allCases) { 选项...
我在 Office 2010 中有一个幻灯片演示文稿,希望使用文本框作为计算的输入,并在值更改时在另一个文本框中显示结果。 在 StackOver 的帮助下...
如何清除 Textfield 并在 Flutter 中的 OnChange 事件上将焦点返回到同一个 Textfield 控制器?
我在 Flutter 应用程序中有一个 Textfield 控制器,我想清除该 Textfield 并在将该 Textfield 的值传递到该 Textfield 自己的 OnChange 事件后重新聚焦于它。 其实我...
e.preventDefault 在 onChange 事件中不起作用,React
我正在尝试将输入类型从数字更改为文本,但我希望用户只能输入数字、点或逗号。我编写了 onChange 处理程序来检查输入是否仅包含允许的符号...
CodeMirror 6,如何在输入/更新/更改事件上获取编辑器值?
我希望 CodeMirror 6 编辑器实例的内容/值反映在外部变量中,当文本更改时变量更改/同步。 如何在 CodeMirror 6 中做到这一点? 伪鳕鱼...
如何使用 Google Sheet 的 JavaScript 的 on Change 触发器来更改填充有过滤功能的单元格的字体颜色?
我有一个带有过滤功能的单元格。我想在值发生变化时为过滤函数填充的单元格设置找到的颜色。 onEdit 适用于手动更改的单元格...
我试图在更改下拉列表的值时显示警报。使用道场。这是我的代码: 页面加载时会附加此事件... dojo.query('#inquiry_type select').connect('onchange',...
我有一个包含纸箱数量值的输入字段数组,我想确保扣除的纸箱数量不会超过所需数量。当只有一个输入字段时它会起作用,例如当我......
我有一个用于显示所有列表的 API 和另一个用于显示搜索词列表的 API,但在这里,我从所有列表中获取 selectedDataID,但从搜索列表中选择的项目未获取 selectedDataID。嗬...
如何使用 Provider 提供初始值并将更改的值保存在 TextFields 中?
我有一个带有简单数据模型的应用程序 笔记( 字符串标题, 字符串内容 ) 我要问的 UI 部分基本上是一个带有 ListView 的 Row,其中显示旁边的注释标题...
为什么每当触发 onChanged 事件时,TextField 中的光标就会跳到文本开头?
我的应用程序有(除其他外)一个 TextField 和 ElevatedButton。我正在使用 Provider 管理状态。我希望当 TextField 的内容更改时按钮颜色从白色更改为蓝色。 我有...
如何使用 ngModelChange 实现 Angular 中的 React onchange 事件
html: html: <mat-form-field appearance="outline"class="inputBox"> <input matInput name="total" placeholder="0.00" [ngModel]="total" (ngModelChange)="handleOnChange('total', $event)" /> </mat-form-field> TS: public handleOnChange = (field, e) => { console.log("hell", field) this.total=90 } 在任何更改事件触发handleOnChange方法后,this.total的值应保持恒定在90,并且90应不断显示在输入框中。这是我试图实现的逻辑。但是当有onChange时第一次,输入值更改为 90,但第一次按下任意键后,值会更改..例如..90a,90tyhuil,90oojh.... 我来自react..有人请建议我如何在Angular中的react输入标签中实现onChange事件。 删除(ngModelChange)事件 <mat-form-field appearance="outline"class="inputBox"> <input matInput name="total" placeholder="0.00" [ngModel]="total"/> </mat-form-field> 现在在构造函数中初始化总计的值,以便在输入更改之前它将保持不变 constructor() { this.total=90 } 现在将 [ngModel]="total" 替换为 [(ngModel)]="total",它将自动将新值分配给 Total,并将反映在输入中,并添加 [value]="total" 以将初始值重新填充到输入中 所以最终代码将是 <mat-form-field appearance="outline"class="inputBox"> <input matInput name="total" placeholder="0.00" [(ngModel)]="total" [value]="total"/> </mat-form-field> 我们可以将输入字段直接传递给函数并将值设置为所需的结果,这将覆盖任何更改! html <mat-form-field> <mat-label>Input</mat-label> <input matInput name="total" placeholder="0.00" [ngModel]="total" #input (ngModelChange)="handleOnChange('total', $event, input)" /> </mat-form-field> ts public handleOnChange = (field: any, e: any, input: any) => { console.log('hell', field); this.total = 90; input.value = 90; }; Stackblitz 演示
如何使用 ngModelChange 实现 Angular 中的 onchange 事件反应
html: html: <mat-form-field appearance="outline"class="inputBox"> <input matInput name="total" placeholder="0.00" [ngModel]="total" (ngModelChange)="handleOnChange('total', $event)" /> </mat-form-field> TS: public handleOnChange = (field, e) => { console.log("hell", field) this.total=90 } 在任何更改事件触发handleOnChange方法后,this.total的值应保持恒定在90,并且90应不断显示在输入框中。这是我试图实现的逻辑。但是当有onChange时第一次,输入值更改为 90,但第一次按下任意键后,值会更改..例如..90a,90tyhuil,90oojh.... 我来自react..有人请建议我如何在Angular中的react输入标签中实现onChange事件。 删除(ngModelChange)事件 <mat-form-field appearance="outline"class="inputBox"> <input matInput name="total" placeholder="0.00" [ngModel]="total"/> </mat-form-field> 现在在构造函数中初始化总计的值,以便在输入更改之前它将保持不变 constructor() { this.total=90 } 现在将 [ngModel]="total" 替换为 [(ngModel)]="total",它将自动将新值分配给 Total,并将反映在输入中,并添加 [value]="total" 以将初始值重新填充到输入中 所以最终代码将是 <mat-form-field appearance="outline"class="inputBox"> <input matInput name="total" placeholder="0.00" [(ngModel)]="total" [value]="total"/> </mat-form-field>
在 Safari 浏览器中,在输入事件处理程序中修改元素的值时不会触发更改事件
在输入元素的输入事件中修改元素的值时,Safari 浏览器中不会触发更改事件。 我使用了下面的代码块 ` 在输入元素的输入事件中修改元素的值时,Safari 浏览器中不会触发更改事件。 我使用了下面的代码块 `<input type="text" id="textid"\> <script\> var textcase = document.getElementById('textid'); textcase.addEventListener('input', function(args) { document.getElementById('textid').value =document.getElementById('textid').value + "#"; }); textcase.addEventListener('change', function(){ console.log('Change evet triggered'); }); </script\> ` 复制过程: 在输入元素中输入一个值并退出焦点。 查看控制台窗口,更改事件未触发。 预期行为: 在输入元素的输入事件中修改元素的值时。更改必须在 Safari 浏览器中触发。 我刚刚在 Safary 中遇到了同样的问题。 Firefox 和 Chrome 工作正常,但 Safari 不行。 你找到解决办法了吗? 到目前为止我能找到的唯一方法是手动创建“更改”事件并通过 element.dispatchEvent 处理程序中的 input 触发它。但就我而言,使用这个解决方案我无法实现我的目标,所以它不是我的选择。
我正在学习 React 测试库,并努力理解如何使用 onchange 验证错误消息。 我什至简化了它,以便在两个输入都有效之前禁用该表单。 它适用于...