- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 React 中遇到了一个大问题 - 可能是缺乏理解。我有一个进行回调的子组件,并具有一个 componentWillReceiveProps 函数。问题是我无法在 child 持有的文本输入上书写。我会用代码更好地解释自己。
问题
我有一个有文本输入的 child 。那个 child 在他 parent 的体内。
我需要:
child
有一个用于显示文本的文本 Prop 。textChanged 是父级将订阅的回调。
家长
包含子项,具有用于子项回调的函数,该函数不会更新子项的状态,并包含一个按钮来修改子项的文本。
问题
如果我在输入中写入文本,则效果不佳。如果我删除子级中的回调调用( this.props.textChanged(event.target.value); 部分),输入工作正常,但父级不会收到子级更新。如果我删除 componentWillReceiveProps 部分,我将无法从其父级更新子级的文本。
您可以使用代码片段 - 它“有效”。
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<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>
<div id='container'></div>
<script type="text/babel">
var Child = React.createClass({
propTypes: {
text: React.PropTypes.string,
textChanged: React.PropTypes.func
},
getInitialState: function () {
return ({
text: this.props.text
});
},
handleChange: function (event) {
if (event.target.value != null) {
this.setState({ text: event.target.value });
if (this.props.textChanged !== undefined) {
this.props.textChanged(event.target.value);
}
}
},
componentWillReceiveProps: function(nextProps) {
if (nextProps.text != this.state.text) {
this.setState({
text: nextProps.text
});
}
},
render: function () {
return (
<div>
<input className="form-control" value={this.state.text} onChange={this.handleChange} />
</div>
);
}
});
var Parent = React.createClass({
propTypes: {
childText: React.PropTypes.string,
},
getInitialState: function () {
return ({
childText: this.props.childText,
stateChangingProperty: true
});
},
handleTextChange: function (event) {
this.setState({
stateChangingProperty: !this.state.stateChangingProperty
});
},
handleButton: function () {
this.setState({
childText: "SOMETHING NEW"
});
},
render: function () {
return (
<div>
<Child text={this.state.childText} textChanged={this.handleTextChange} />
<button type="button" onClick={this.handleButton}>Write SOMETHING NEW on child</button>
</div>
);
}
});
ReactDOM.render(<Parent childText="text" />,
document.getElementById('container')
);
</script>
问题
我怎样才能实现预期的行为?我的目标错了吗?
提前致谢!
最佳答案
不太确定您要做什么,但我会让您的父组件来编排规则并处理文本更改和按钮单击等事件,只需让子组件实际上是“哑巴”,专注于渲染数据。
作为一个例子,我已经实现了这个 here
正如您将看到的,Child 组件中的大多数生命周期方法都可以删除。现在,如果您需要应用任何“业务逻辑”来修改输入的内容,您可以在控制 Parent 组件的 handleTextChange 函数中执行此操作(例如,转换为上情况并设置状态)。
这种容器模式在 React 中非常常见和惯用: https://medium.com/@learnreact/container-components-c0e67432e005#.jg5yiorko
关于javascript - componentWillReceiveProps 和回调问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40654400/
我正在使用使用 ReactSwipableView 包的 Material ui SwipeableViews,我在控制台上收到此错误 react-dom.development.js:12466 W
在我的其他类中,componentWillReceiveProps 工作得很好,但由于某种原因,它在这里没有触发。 ItemView.jsx class ItemView extends React.
我对 React 开发还很陌生,但我已经使用 React+Redux 开发了 3 个大项目,并且我看到了一个我非常不喜欢的模式: componentWillReceiveProps(nextProps
我在构造函数中定义了一个状态,就像这样 this.state={ datainaccordion:'', }; 现在在我的 componentWil
我有以下组件代码: var Answer = React.createClass({ getInitialState: function(){ return { comments:
我在 React 中遇到了一个大问题 - 可能是缺乏理解。我有一个进行回调的子组件,并具有一个 componentWillReceiveProps 函数。问题是我无法在 child 持有的文本输入上书
我最近想升级我的知识React ,所以我从组件生命周期方法开始。让我好奇的第一件事是这个componentWillReceiveProps .所以,文档说当组件接收新的(不一定是更新的) Prop 时
我有以下高阶组件来在我的组件上创建一个负载: import React, {Component} from 'react'; import PropTypes from 'prop-types'; i
我正在尝试在收到新 Prop 后立即更新子组件。但是,我的子组件中的 componentWillReceiveProps() 在 Prop 实际更新之前被调用。看完this article我明白为什么
在我的子组件中使用以下方法更新 Prop 更改状态,效果很好 componentWillReceiveProps(nextProps) { // update original state
我的直觉告诉我不行,但我很难想到更好的方法。 目前,我有一个显示项目列表的组件。根据提供的 props,此列表可能会发生变化(即过滤更改或上下文更改) 例如,给定一个新的 this.props.typ
所以我是 react 新手,想知道如何创建一个传递一些参数的页面并根据这些参数获取文档。但是,当我尝试使用 componentWillReceiveProps 时,我发现它没有运行,我不知道为什么。那
我是 React 新手,正在经历 React 的生命周期,但是我对 componentWillReceiveProps 的使用有点困惑。 谁能解释一下在什么情况下应该使用它。 谢谢。 最佳答案 当 p
我有一个由react-router (path="profile/:username") 加载的Profile 组件,该组件本身如下所示: ... import { fetchUser } from
这个问题已经有答案了: Can getDerivedStateFromProps be used as an alternative to componentWillReceiveProps (1 个
我通读了https://reactjs.org/blog/2018/03/27/update-on-async-rendering.html#fetching-external-data-when-p
我是 React/Redux 新手,并且对状态有疑问。 TrajectContainer.jsx class TrajectContainer extends React.Component {
我有一个组件,它由父组件通过传递 prop 来更新。在 componentWillReceiveProps 中,我想更改一个状态(availableData),其中包含来自 prop(newData)
在我拥有的组件中,我使用 componentWillReceiveProps() 异步设置组件中的多个状态。父组件正在向该子组件发送新的 props。我的期望是,每当 child 获得新的 Prop
我有一个连接到 redux 存储的组件,并且有一个如下所示的代码块: if (this.props.person !== nextProps.person) { ... } else {
我是一名优秀的程序员,十分优秀!