将组件更新/附加到React中的另一个组件

时间:2016-04-13 14:19:23

标签: javascript reactjs components

我是新手,我正处于学习阶段。我想要做的是有一个带有截止日期的待办事项列表。 以下是我的React组件:

var TaskTitle = React.createClass({
    render: function() {
        return (
            <div className="taskTitle">
                <textarea  ref="tskTitle" onBlur={this.props.handleTitleBlur} onChange={this.props.setTaskTitle} name="tasktitle[]" id="tasktitle" value={this.props.taskTitle} className="tasktitle" ref="tskTitle"></textarea>
            </div>
        );
    }
}); 

日历组件

 var CalendarWithTime = React.createClass({
        componentDidMount: function() {
          this.myCalendarInput = $(ReactDOM.findDOMNode(this.refs.showCal));
          var self = this;
          this.CalendarWithTime = this.myCalendarInput.datetimepicker({
            format:'Y-m-d H:m',
            onShow:function(){
                self.props.calendarOpen(); //Updating parent state
            },
            onClose:function(){
                self.props.calendarClosed();//Updating parent state
            },
            onChangeDateTime:function(dp,input){
                self.props.dateChange(dp,input); //Updating parent state
            }
          });
        },
        render: function() {
            return (
                <div className="datetimeWrapper">
                    <div className="datetime clearfix">
                        <div ref="showCal" className="showCalendar">
                        </div>

                    </div>
                </div>
            );
        }
    });

单Todo组件

var ToDo = React.createClass({
    handleCalendarOpen:function(){
        this.setState({ canUpdate:false });
    },
    handleCalendarClose:function(){
        this.setState({ canUpdate:true });
        this.updateTaskData();
    },
    stateUpdate:function(obj){
        for(var key in obj){
            this.state[key] = obj[key];
        }
    },
    getInitialState: function() {
        return {taskID:null,taskTitle:null,taskDueDateTime:null};
    },  
    setTaskTitle:function(event){
        this.setState({ taskTitle: event.target.value,canUpdate:false });
    },
    componentWillReceiveProps:function(newProps){
            this.setState({ 
                taskTitle: newProps.tskTitle,
                taskDueDateTime:newProps.dueDate, 
                canUpdate:true
            });
    },
    updateTaskTitle:function(event){
        this.setState({taskTitle:event.target.value,canUpdate:false});
        this.updateTaskData();
    },
    updateTaskData:function(){
        var self =this;

        setTimeout(function(){
            $.ajax({
              url: $('meta[name="baseurl"]').attr('content')+'api/save_task',
              dataType: 'json',
              method:'post',
              data:self.state,
              cache: false,
              success: function(data) {
                if(data.status){
                    self.setState({canUpdate:true});
                }                   
              }.bind(this),
              error: function(xhr, status, err) {
                console.error(this.props.dataURL, status, err.toString());
              }.bind(this)
            });
        },500);
    },
    componentDidMount:function(){
            var seldate=this.props.tskDueDate,dueDate=null,dueTime=null,dueLabel=null;
            if(seldate){
                dueDate = moment(seldate,'YYYY-MM-DD hh:mm a').format('YYYY-MM-DD'),
                dueTime = moment(seldate,'YYYY-MM-DD hh:mm a').format('hh:mm a'),
                dueLabel = moment(seldate,'YYYY-MM-DD hh:mm a').format('MMM Do, hh:mm a');
            }
            this.setState({
                taskTitle:this.props.tskTitle,
                taskDueDateTime:this.props.tskDueDate,  
                canUpdate:true,
            });
    },
    render: function() {
        return (
            <tr className="resp-table">
                <td><TaskTitle taskTitle={this.state.taskTitle} setTaskTitle={this.setTaskTitle} canUpdate={this.state.canUpdate} handleTitleBlur={this.updateTaskTitle} onUpdate={this.stateUpdate} key={this.state.taskID +"0"+this.state.taskID} taskID={this.props.tskID} /></td>   
                <td><CalendarWithTime  calendarClosed={this.handleCalendarClose} calendarOpen={this.handleCalendarOpen} dateChange={this.handleDateChange} dueDateTime={this.state.taskDueDateTime} dueDate={this.state.taskDueDate} dueTime={this.state.taskDueTime} dueLabel={this.state.taskDueLabel} key={this.state.taskID +"2"+this.state.taskID} /></td> 
            </tr>
        );
    }
});

//加载以前的任务(如果有的话)

var PrevTaskList = React.createClass({
        loadTaskList:function(){
            $.ajax({
              url: $('meta[name="baseurl"]').attr('content')+'api/get_task/',
              dataType: 'json',
              method:'post',
              data:{wsID:$('body').attr('data-wsid')},
              cache: false,
              success: function(data) {
                if(data.status){
                    this.setState({taskListData: data.taskList});
                }                   
              }.bind(this),
              error: function(xhr, status, err) {
                console.error(this.props.dataURL, status, err.toString());
              }.bind(this)
            });
        },
        componentWillMount: function() {
            this.loadTaskList();
            setInterval(this.loadTaskList,this.props.pollInterval); // to render any new task added by other users
        },
        render: function() {
            if(this.state.taskListData){
                var TaskNodes = this.state.taskListData.map(function(task){
                    return(
                        <ToDo key={task.task_id}  tskID={task.task_id} tskTitle={task.task_title} tskDueDate={task.task_due_date} />
                    );
                },this);

                return (
                        <table ref="taskTable" id="tasktable">
                            <tbody >
                                {TaskNodes}
                            </tbody>
                        </table>
                );
            }
        }
}); 

渲染最终组件

ReactDOM.render(<PrevTaskList pollInterval="5000"/>,$('#taskWrapper').get(0));

现在,如何在文本区域(TaskTitle)组件中按Enter键添加新任务?我很困惑这里提供事件以及如何渲染 空任务。我的组件建模是否正确?任何帮助将不胜感激..等待帮助..希望

0 个答案:

没有答案