- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个基本的登录页面,该页面接受用户凭据并将其提交给登录 api。问题是当 onChange
事件触发时,为了设置用户凭据,元素失去了焦点。我不应该使用 onChange
更新凭据吗?
import React, {Component, PropTypes} from 'react';
import {Row, Col, FormControl, FormGroup, ControlLabel, HelpBlock, Checkbox, Button} from 'react-bootstrap';
export default class Login extends React.Component {
constructor(props, context) {
super(props, context);
this.state = {credentials: {username: '', password: ''}};
this.onChange = this.onChange.bind(this);
this.onSave = this.onSave = this.onSave.bind(this);
}
onChange(event) {
const field = event.target.name;
const credentials = this.state.credentials;
credentials[field] = event.target.value;
return this.setState({credentials: credentials});
console.log(event);
}
onSave(event) {
event.preventDefault();
console.log(this.state.credentials);
this.props.actions.logInUser(this.state.credentials);
}
render() {
function FieldGroup({ id, label, help, ...props }) {
return (
<FormGroup controlId={id}>
<ControlLabel>{label}</ControlLabel>
<FormControl {...props} />
{help && <HelpBlock>{help}</HelpBlock>}
</FormGroup>
);
}
const formInstance = (
<Col xs={12} md={8} mdOffset={2}>
<form>
<FieldGroup
name="username"
label="Username"
placeholder="Enter username"
value={this.state.credentials.username}
onChange={this.onChange}
/>
<FieldGroup
name="password"
label="Password"
type="password"
placeholder="Enter password"
value={this.state.credentials.password}
onChange={this.onChange}
/>
<Checkbox checked readOnly>
Checkbox
</Checkbox>
<Button type="submit" onClick={this.onSave}>
Submit
</Button>
</form>
</Col>
);
return formInstance;
}
}
编辑
按照建议,当 FieldGroup 移动到单独的组件时工作。
common/FieldGroup.jsx
import React from 'react';
import {FormControl, FormGroup, ControlLabel, HelpBlock} from 'react-bootstrap';
export default class FieldGroup extends React.Component {
constructor(props) {
super(props);
console.log('props');
console.log(props);
this.id = props.name;
this.label = props.label;
this.help = props.placeholder;
}
render() {
return (
<FormGroup controlId={this.props.name}>
<ControlLabel>{this.props.label}</ControlLabel>
<FormControl {...this.props} />
{this.props.help && <HelpBlock>{this.props.help}</HelpBlock>}
</FormGroup>
);
}
}
components/Login.jsx
import React, {Component, PropTypes} from 'react';
import {Col, Checkbox, Button} from 'react-bootstrap';
import FieldGroup from '../common/FieldGroup';
export default class Login extends React.Component {
constructor(props, context) {
super(props, context);
this.state = {credentials: {username: '', password: ''}};
this.onChange = this.onChange.bind(this);
this.onSave = this.onSave = this.onSave.bind(this);
}
onChange(event) {
const field = event.target.name;
const credentials = this.state.credentials;
credentials[field] = event.target.value;
return this.setState({credentials: credentials});
}
onSave(event) {
event.preventDefault();
console.log(this.state.credentials);
this.props.actions.logInUser(this.state.credentials);
}
render() {
return (
<Col xs={12} md={8} mdOffset={2}>
<form>
<FieldGroup
name="username"
label="Username"
placeholder="Enter username"
value={this.state.credentials.username}
onChange={this.onChange}
/>
<FieldGroup
name="password"
label="Password"
type="password"
placeholder="Enter password"
value={this.state.credentials.password}
onChange={this.onChange}
/>
<Checkbox checked readOnly>
Checkbox
</Checkbox>
<Button type="submit" onClick={this.onSave}>
Submit
</Button>
</form>
</Col>
)
}
}
最佳答案
这是一个有趣的问题,因为它表明即使无状态功能组件 (SFC) 没有生命周期方法,它们也会在更改时被卸载和重新装载。这没有清楚地记录下来,但可以在 react implementation notes 中看到(对于 SFC,type
是 SFC 函数本身)。
因为 FieldGroup
在 render
内声明,每次渲染都会创建一个新函数,这会导致虚拟 dom 中先前的 SFC 组件卸载并被新组件替换。即使它们的渲染完全相同,也会发生这种情况。因此,任何后代输入元素都将卸载并重新装载,在此过程中丢失状态和焦点。
如果您只是调用 SFC 而不是实例化它(即 {SFC({...sfcProps})}
而不是 <SFC {...sfcProps}/>
,则不会为 SFC 本身创建任何虚拟 dom 组件,并且如果呈现保持不变,则不会发生重新挂载。
此代码片段显示了一个本地 SFC(实例化并作为函数调用)以及一个常规的顶级 SFC。只有底部的两个输入可以正常工作。
const SFC = ({rerender}) => <input onChange={rerender}/>
class App extends React.Component {
rerender = () => this.forceUpdate();
render () {
const LocalSFC = ({rerender}) => <input onChange={rerender}/>
return (
<div>
<div>Local SFC (loses state & focus on typing): <LocalSFC rerender={this.rerender}/></div>
<div>Local function application (works fine): {LocalSFC({rerender: this.rerender})}</div>
<div>Regular SFC (works fine): <SFC rerender={this.rerender}/></div>
</div>
);
}
}
ReactDOM.render(<App/>, document.getElementById('app'));
<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>
<body>
<div id="app"></div>
</body>
所以要解决这个问题,您可以替换每个 <FieldGroup name=.. label=.. ../>
通过 {FieldGroup({name: .., label:.., ..})}
, 但按照 Jaxx 的建议去做并简单地提升 FieldGroup
更有意义来自 Login
类到顶层或单独的文件。
关于reactjs - React Noob - onChange 元素失去焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46777832/
在我的真实代码中,我有一个对象池,它创建了我完全忘记的“Foo”。问题是我从来没有首先创建“酒吧”!直到你们中的一些人在执行“IExample Bar”的示例中提到我的错误时,我才意识到这一点。谢谢你
我之前曾使用此网站来帮助我完成许多编程作业,但我找不到与我现在遇到的问题类似的任何内容。 我尝试首先使用方法 printHobby 打印 person 类的 toString 中的 myHobbies
这个问题已经有答案了: Creating an array of objects in Java (9 个回答) 已关闭 8 年前。 我收到 NullPointerException 错误,但无法找出
我正在尝试使用 F# 并尝试将单词列表的映射缩减为一个单词,计数。 这是我目前所拥有的, let data1 = ["Hello"; "Hello"; "How"; "How"; "how"; "ar
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我正在启动 Addy Osmani 的 amazing book on javascript design patterns但似乎无法起步。谁能告诉我我的方法有什么问题(我使用 Raphael,只是为
我是一个 jQuery 新手,我正在尝试让这个列表按照我希望的方式工作......一个 li 一次被选中,其他的被选中隐。它的工作原理是 ul 展开以显示 li(s) 但随后 不允许您选择不同的 li
这个问题在这里已经有了答案: Vertically align text next to an image? (26 个答案) 关闭 5 年前。
我无法弄清楚调用的参数!这些是我的原型(prototype): void printIdInfo(ofstream &, string , string , const string, string,
这个问题在这里已经有了答案: multiple files upload using same input name in django (4 个答案) 关闭 10 年前。 我有以下名为 reque
我正在尝试使用计算给定数字的斐波那契数列的示例项目来学习 CMake。我的项目最初包含一个“.c”文件和标题。我能够使用 CMake 构建并毫无问题地运行。现在我正在尝试学习如何通过将我的 fibno
我的 Customer 类中有一个名为 save_from_row() 的方法。它看起来像这样: @classmethod def save_from_row(row): c = Custom
我正在编写一个简单的小脚本,以便在 Ultra 音乐节早鸟票开始销售时向我发送短信,以便我抢购。当我开始写这篇文章时,我认为 python 将是实现我目标的快速方法。我所做的是收集链接,然后计算它们并
这个问题在这里已经有了答案: 关闭 12 年前。
我有以下 C++ 类: class Eamorr { public: redispp::Connection conn; Eamorr(string& home, st
首先,我不知道该如何真正向大家展示我在做什么,也没人能真正访问该网站,因为它是网站所在的专用网络。这是JMeter的屏幕截图: 我只是尝试登录到我们的网站,但是在“/common/j_security
我正在尝试使用Javascript在my nav bar中加载更多链接。 这是我尝试过的;我只希望导航中的一个链接在其下方加载更多内容。 collections function show() {
我已经在我的 NOOBS 操作系统上安装了 v4l2loopback,但它不起作用。 我已经检查过是否安装了 v4l2loopback,它是。但是当我输入 sudo modprobe v4l2loop
我目前正在尝试创建一个可以扫描字符串的代码,将找到的每个字母的位置放在与该字母相关联的列表中(例如:如果您将S作为字符串的35、48和120字母,它将将35、48和120放在字母S的列表中)。然后,它
抱歉,我确信这是一个相当简单的 JavaScript 问题,但是每次将成本输入到表中时,如何获得以下总计函数来计算总计,即无需按总计按钮来提交表格。 function totalIt() { va
我是一名优秀的程序员,十分优秀!