Rails和ReactJS -重新渲染组件
Rails and ReactJS - Re-rendering component
所以我仍然在玩Todo应用程序,以学习Reactjs。该应用程序非常简单,用户可以添加新任务并将其标记为已完成。
我在后端使用Rails,使用react-rails gem,并尝试了不同的方法来处理创建新任务或刚刚更新时的组件重新渲染。
而不是在给定的时间间隔从服务器获取数据,我渲染JSON与所有的任务从后端每次创建或更新一个新任务。
我想知道这是否是最优化的方法。这是我的Rails控制器:
class TasksController < ApplicationController
before_filter :get_tasks
def get_tasks
@tasks = Task.where('iscompleted is null').order(created_at: :desc)
end
def index
render :json => @tasks
end
def create
@task = Task.create(task_params)
render :json => @tasks
end
def update
@task = Task.update(params[:id], task_params)
render :json => @tasks
end
private
def task_params
params.require(:task).permit(:id, :name, :iscompleted)
end
end
这是我的ReactJS组件:
var TodoBox = React.createClass({
loadTasksFromServer: function() {
$.ajax({
url: this.props.url,
dataType: 'json',
cache: false,
success: function(data) {
this.setState({data: data.tasks});
}.bind(this)
});
},
handleTaskSubmit: function(task) {
$.ajax({
url: this.props.url,
dataType: 'json',
type: 'POST',
data: {task},
success: function(data) {
this.setState({data: data.tasks});
}.bind(this),
error: function(xhr, status, err) {
console.error(this.props.url, status, err.toString());
}.bind(this)
});
},
handleTaskCompleted: function(task) {
$.ajax({
url: '/task/' + task.id,
dataType: 'json',
type: 'PATCH',
data: {task},
success: function(data) {
this.setState({data: data.tasks});
}.bind(this),
error: function(xhr, status, err) {
console.error(this.props.url, status, err.toString());
}.bind(this)
});
},
getInitialState: function() {
return {
data: []
};
},
componentDidMount: function() {
this.loadTasksFromServer();
},
render: function() {
return (
<div className="todoBox">
<div className="container-fluid col-md-6 col-md-offset-3">
<TodoForm onTaskSubmit={this.handleTaskSubmit}/>
<TodoList onTaskCompleted={this.handleTaskCompleted} data={this.state.data}/>
</div>
</div>
);
}
});
这个方法很有效,但我在这里学习,所以每一个评论或建议将非常感谢。
谢谢
我发现在React中过滤结果更有效,因为它不需要从后端呈现所有任务。因此,我只从rails后端呈现新对象或更新对象,如下所示:
class TasksController < ApplicationController
def index
@tasks = Task.all
render :json => @tasks
end
def create
@task = Task.create(task_params)
render :json => @task
end
def update
@task = Task.update(params[:id], task_params)
render :json => @task
end
private
def task_params
params.require(:task).permit(:id, :name, :iscompleted)
end
因此React组件看起来像这样:
var TodoBox = React.createClass({
loadTasksFromServer: function() {
var rawData = [];
$.ajax({
url: this.props.url,
dataType: 'json',
cache: false,
success: function(data) {
this.setState({data: data.tasks});
}.bind(this)
});
},
handleTaskSubmit: function(task) {
$.ajax({
url: this.props.url,
dataType: 'json',
type: 'POST',
data: {task},
success: function(data) {
this.state.data.push(data.task);
this.setState({data: this.state.data});
}.bind(this),
error: function(xhr, status, err) {
console.error(this.props.url, status, err.toString());
}.bind(this)
});
},
handleTaskCompleted: function(task) {
$.ajax({
url: '/task/' + task.id,
dataType: 'json',
type: 'PATCH',
data: {task},
success: function(data) {
task.iscompleted = data.task.iscompleted;
this.setState({data: this.state.data});
}.bind(this),
error: function(xhr, status, err) {
console.error(this.props.url, status, err.toString());
}.bind(this)
});
},
getInitialState: function() {
return {
data: []
};
},
componentDidMount: function() {
this.loadTasksFromServer();
},
render: function() {
return (
<div className="todoBox">
<div className="container-fluid col-md-6 col-md-offset-3">
<TodoForm onTaskSubmit={this.handleTaskSubmit}/>
<TodoList onTaskCompleted={this.handleTaskCompleted} data={this.state.data}/>
</div>
</div>
);
}
});
然后我在TodoList组件中过滤结果,然后再显示它们
相关文章:
- 追加新web组件时出现线程问题
- 如何强制对模态进行新渲染
- React-router 在添加历史记录后不会渲染组件
- react使用扩散属性渲染组件列表
- 使用Handlebars从动态变量渲染组件
- 反应嵌套路由不渲染组件
- 反应.js如何在组件内部渲染组件
- 使用其名称进行 React 渲染组件
- ReactJs:如何在渲染组件时传递初始状态
- 如何使用 Flux+React.js 从数据库回调渲染组件
- 使用不同道具在容器中多次响应渲染组件
- 使用vue.js在其外部渲染组件模板
- ReactJs上的无尽循环渲染组件
- 当另一个组件发生更改时,React重新渲染组件
- react.js在不同的位置渲染组件
- React.render()未渲染组件
- Rails和ReactJS -重新渲染组件
- React: componentDidMount + setState不重新渲染组件
- 如何在React 0.14中使用新道具在顶层再次渲染组件
- 在递归聚合物组件中插入新子组件时,无法读取未定义的属性“concat”