gpt4 book ai didi

javascript - React 如何抑制输入字段值的变化?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:43:11 26 4
gpt4 key购买 nike

我已经完成了 Learn React.js (without JSX)詹姆斯尼尔森系列。该系列介绍了一个用 React 实现的表单,并展示了输入字段实际上是只读的,然后继续解释如何正确更改值。这不是关于如何这样做的问题。相反,我想了解 React 如何防止值发生变化。

下面的代码(也在 jsfiddle 中)是一个 SSCCE:

<!doctype html>
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.7/react.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.7/react-dom.js"></script>
</head>
<body>
<div>
<h3>simple HTML form (no ReactJS)</h3>
<form>
<input type='text' value placeholder='please enter your name'>
</form>
</div>
<div id='react-app'>
<script type='text/javascript'>
const rce = React.createElement.bind(React);
const rcc = React.createClass.bind(React);

const ContactForm = rcc({
propTypes: {
value: React.PropTypes.object.isRequired,
},
render: function() {
return rce('form', {}
, rce('input', {type: 'text'
, placeholder: 'please enter your name'
, value: this.props.value.name
, onInput: function(se) {
console.log(se.target.value);
}}))}
, componentWillMount : function () {console.log('componentWillMount');}
, componentDidMount : function () {console.log('componentDidMount');}
, componentWillReceiveProps: function () {console.log('componentWillReceiveProps');}
, shouldComponentUpdate : function () {console.log('shouldComponentUpdate');}
, componentWillUpdate : function () {console.log('componentWillUpdate');}
, componentDidUpdate : function () {console.log('componentDidUpdate');}
, componentWillUnmount : function () {console.log('componentWillUnmount');}
});

const ContactView = rcc({

propTypes: {
newContact: React.PropTypes.object.isRequired,
}
,render: function () {
console.log('render called');
return rce('div', {}
, rce('h3', {}, 'why doesn\'t the input field value change?')
, rce(ContactForm, {
value: this.props.newContact
}))
}
});

var reactApp = rce(ContactView, {newContact: {name: ''}});
ReactDOM.render(reactApp, document.getElementById('react-app'));
</script>
</body>
</html>

上面的代码产生了两种 html 形式:一种是用简单的 HTML 创建的,另一种是用 ReactJS 创建的。呈现的元素是相同的:

对于简单的 HTML 表单:

enter image description here

对于使用 ReactJS 创建的 HTML 表单:

enter image description here

我在控制台上为每个被调用的组件生命周期方法记录消息。唯一似乎被调用的是 rendercomponentWillMountcomponentDidMount(并且仅在开头)。当在输入文本字段中输入击键时,不会调用后续的生命周期方法。

所以我的问题是:假设没有调用额外的生命周期方法,ReactJS 如何设法防止输入字段值发生变化,因为它的 DOM 表示相同到纯 HTML 表单输入字段的值(当我在输入字段中键入内容时,浏览器中显示的值确实确实发生了变化)?

最佳答案

React 使用 virtual DOM 的概念.它所做的是“虚拟地”跟踪更改,并用这种抽象替换“真实”的 DOM。

当组件被(重新)渲染时,它会将虚拟 DOM 映射到“真实”DOM。一旦您的输入字段值绑定(bind)到通过 props 接收的值,它就不会更改(因为您没有更改 props)。

如果您希望值与您输入的内容保持同步,您可以将您的值绑定(bind)到组件 state

关于你的第二个问题,我没有完全理解,但你可能想看看 component's lifecycle .这使您可以在发生某些变化时控制您的组件(例如,新的 Prop 被传递下来)。

更新

我觉得我说的不够清楚,让我详细说明一下。

根据docs :

<input type="text" name="title" value="Untitled" />

这会呈现一个输入已初始化,其值为 Untitled。当用户更新输入时,节点的 value property 将发生变化。但是,node.getAttribute('value') 仍将返回初始化时使用的值,Untitled

[属性与值(value)可能会让我感到困惑。 Here's an explanatory post. ]

与 HTML 不同,React 组件必须在任何时间点表示 View 的状态,而不仅仅是在初始化时。例如,在 React 中:

render: function() {
return <input type="text" name="title" value="Untitled" />;
}

由于此方法描述了任何时间点的 View ,因此文本输入的值应该始终Untitled

关于javascript - React 如何抑制输入字段值的变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36267844/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com