如何在React 0.14中使用新道具在顶层再次渲染组件
How to render component again at the top level with the new props in React 0.14
在新的React.js 0.14中,setProps
方法已从React.Component
弃用。根据文档,现在我们应该用新的道具再次渲染组件(使用ReactDOM.render()
)问题是我该怎么做?让我们看一个例子。
AddTaskForm.js
import React from 'react';
class AddTaskForm extends React.Component
{
onClick() {
this.setProps({
isVisible: false
});
}
render() {
return (
<form role="form">
<div className="row" className={ this.props.isVisible ? 'show' : 'hidden' }>
<input className="form-control" type="text" />
</div>
<button type="button" className="btn" onClick={this.onClick.bind(this)}>Add task</button>
</form>
);
}
}
export default AddTaskForm;
Todo.js
var React = require('react');
var ReactDOM = require('react-dom');
var AddTaskForm = require('./AddTaskForm');
class Todo extends React.Component
{
render() {
return (
<div>
<AddTaskForm isVisible="false"></AddTaskForm>
</div>
);
}
}
ReactDOM.render(<Todo />, document.getElementById('app'));
顺便说一句。我使用的是ES6阶段0,如果你发现自己对语法感到困惑
好的,我不能调用setProps
,我必须在Todo.js
中渲染AddTaskForm
组件。在这种情况下我怎么做呢?我在react的博客上读过这篇文章,但是wrapper并没有真正帮助我。
您根本不应该使用setProps
。React中的属性必须是不可变的数据,所以你不能改变它们。看起来isVisible
prop确实是组件状态的一部分,因为取决于它,组件决定显示或不显示自己。在更改数据后需要更新组件状态的情况下,最好的选择是。我建议阅读这个关于state的文档,以及哪些应该和不应该进入state
从你的例子:
<div>
<AddTaskForm isVisible="false"></AddTaskForm>
</div>
. .你怎么知道AddTaskForm
应该是可见的?现在它是硬编码的。我建议这样做:
render () {
let shouldFormBeVisible = ...// somehow get to know should it be visible or not
return (
<div>
shouldFormBeVisible ? <AddTaskForm /> : null
</div>
)
}
这是一个很大的优势:你甚至不需要渲染 AddTaskForm
,如果isVisible
是假的,那么隐藏它。
isVisible
是一个可变状态,所以它需要被存储在某个状态。
AddTaskForm
:
import React from 'react';
class AddTaskForm extends React.Component
{
constructor(props, context) {
super(props, context);
this.state = { isVisible: true};
}
onClick() {
this.setState({
isVisible: false
});
}
render() {
return (
<form role="form">
<div className="row" className={ this.state.isVisible ? 'show' : 'hidden' }>
<input className="form-control" type="text" />
</div>
<button type="button" className="btn" onClick={this.onClick.bind(this)}>Add task</button>
</form>
);
}
}
export default AddTaskForm;
Todo.js
var React = require('react');
var ReactDOM = require('react-dom');
var AddTaskForm = require('./AddTaskForm');
class Todo extends React.Component
{
render() {
return (
<div>
<AddTaskForm />
</div>
);
}
}
ReactDOM.render(<Todo />, document.getElementById('app'));
另一种方法是将其存储在Todo
组件上,但我认为您已经足够开始了。
相关文章:
- React组件等待所需道具进行渲染
- 为react组件传递道具的最佳方式
- 当组件准备就绪时,如何在Polymer中动态注册新属性
- 在浅层渲染的反应组件上,Enzyme为道具返回null
- 为什么shouldComponentUpdate说当前道具是React中的新道具
- React:向现有组件添加道具
- 反应:如何将当前的道具儿童与新道具儿童进行比较
- React选择性地不将新道具传递给渲染对象
- 你能把一个组件通过道具传给孩子吗
- React Native接收新道具,componentWillReceiveProps
- 了解组件和道具
- React高阶组件初始道具
- 如何在React 0.14中使用新道具在顶层再次渲染组件
- 在React Router 4中向组件传递道具
- 在React中用onchange改变子组件的道具
- 如何在vue.js中为动态组件添加道具
- 当使用新道具调用渲染时,React JS没有完全更新视图
- React路由器不接受组件作为道具
- 应该通用的React List组件从父组件接收道具或监听器
- 正确地解构它.整个组件的道具