ReactJs undefined 不是函数

Posted

技术标签:

【中文标题】ReactJs undefined 不是函数【英文标题】:ReactJs undefined is not a function 【发布时间】:2015-10-29 11:59:26 【问题描述】:

我正在尝试使用 reac 制作动态表单,并且需要使用 ajax 函数提交此表单,我已经有了这个:

    _change:function _change(data)
        console.log(data);
    ,

    render:function()      
        var conjunto = [];
        var element = JSON.parse(this.props.elements);
        return (
         <div className="formNew">
            Object.keys(elementos).map(function(key, index) 
               return    <FormElement key=index change=this._change nombre=key meta=element[key]></FormElement>
            , elementos)
            <input type="submit" value="Submit" />
        </div>                        
        );
     ,  

问题是我有回调的 change 属性,但脚本告诉我 _change 函数未定义,如果我这样做,它可以工作:

        return (
         <div className="formularioAlta">
            Object.keys(elementos).map(function(key, index) 
               return    <FormElement key=index cambia=function(data)console.log(data) nombre=key meta=elementos[key]></FormElement>
            , elementos)
            <input type="submit" value="Submit" />
        </div>                        
        ); 

我如何使用 _change 函数进行回调并确保此设置

在这里你可以看到完整的脚本:

var FormElement=React.createClass(
    getInitialState: function getInitialState() 
        return  errorText: '', inputValue: '' ;
    ,

    propTypes: 
        change: React.PropTypes.func
    ,

    componentDidMount: function() 


    ,                
    toggle:function() 
        this.refs.leftNav.toggle();
    ,

    _handleValidateText: function _handleValidateText() 
        this.props.change(event.target.value);
        this.setState(inputValue: event.target.value,errorText:'');
    ,

    _handleValidateNumber: function _handleValidateNumber(event) 
        if(!isNaN(parseFloat(event.target.value)) && isFinite(event.target.value))
            this.setState(inputValue: event.target.value,errorText:'');
        else
            this.setState(errorText:'Error');
        
        this.props.change(event.target.value);

    ,

    _handleKeyPress: function _handleKeyPress(n,event) 
         this.setState(inputValue: event,errorText:'');
    ,

    render:function()   
        if(this.props.meta.tipo==3)
        var element = <mui.TextField 
                        className=this.props.nombre
                        hintText=""
                        errorText=this.state.errorText
                        value=this.state.inputValue
                        onChange=this._handleValidateText
                        floatingLabelText=this.props.meta.verbose_name>
                    </mui.TextField> 
        else if(this.props.meta.tipo==16)
            var element = <mui.TextField 
                        className=this.props.nombre
                        hintText=""
                        value=this.state.inputValue
                        errorText=this.state.errorText
                        onChange=this._handleValidateNumber
                        floatingLabelText=this.props.meta.verbose_name>
                    </mui.TextField> 
        else if(this.props.meta.tipo==26)
            var element = <mui.DatePicker
                        autoOk=true
                          hintText=this.props.meta.verbose_name
                          onChange=this._handleKeyPress>
                    </mui.DatePicker>
        
        return (
        <div>

          element

        </div>                  
        );
                      
);

var CreaForm=React.createClass(
    mixins:[mui.YBExt.claseBaseTheme.themeMixin],

    getInitialState: function getInitialState() 
        var elementos = JSON.parse(this.props.elementos);
        var objElement = ;
        var change = function _change(data)
            console.log(data);
        
        Object.keys(elementos).forEach(function(key, index) 
            objElement[key]=""
        , elementos);  
        return  elementos: objElement  ;
    ,

    componentDidMount: function() 

    ,  

    toggle:function() 
        this.refs.leftNav.toggle();
    ,

    _handleSubmit:function _handleSubmit(data)
        event.preventDefault();
        console.log(this.state.elementos);
    ,

    _handleFormChange:function _handleFormChange(data)
        this.state.elementos[data.target.name]=data.target.value;
        this.setState(elementos:this.state.elementos);
    ,

    _change:function _change(data)
        console.log(data);
    ,

    render:function()      
        var conjunto = [];
        var elementos = JSON.parse(this.props.elementos);
        Object.keys(elementos).forEach(function(key, index) 
            conjunto.push( 
               <FormElement key=index change=function(data)console.log(data) nombre=key meta=elementos[key]></FormElement>
            );
        , elementos);     

        return (
         <div className="formularioAlta">
            conjunto
            <input type="submit" value="Submit" />
        </div>                        
        );
     ,   


);

【问题讨论】:

【参考方案1】:

你应该在FormElement中定义_onchange函数。

var FormElement  = React.createClass(
     _change:function(data)
          console.log(data);
     ,
     render: function()
        return(
           /*
                    Your code
           */
        );
     
);

因为this 指的是FormElement(child)。您已经在父类中编写了该函数。

【讨论】:

我需要父原因上的 onchange 函数,因为谁需要数据。 @JuanManuel 所做的是正确的,他只是使用错误的语法来定义函数;)检查我的答案 @JuanManuel ***.com/questions/31435467/…【参考方案2】:

如果我这样做不起作用:

   render:function()      
        var conjunto = [];
        var elementos = JSON.parse(this.props.elementos);
        Object.keys(elementos).forEach(function(key, index) 
            conjunto.push( 
               <FormElement key=index cambia=this.cambia nombre=key meta=elementos[key]></FormElement>
            );
        , elementos);     

        return (
         <div className="formularioAlta">
            conjunto
            <input type="submit" value="Submit" />
        </div>                        
        );
     ,   

但如果我只有一个或几个 formElements 可以正常工作,但我需要 map 函数来显示所有元素:

  render:function()      

        var elementos = JSON.parse(this.props.elementos);

        return (
         <div className="formularioAlta">
            <FormElement key=index cambia=this.cambia nombre=key meta=elementos[key]></FormElement>
            <input type="submit" value="Submit" />
        </div>                        
        );
     ,   

【讨论】:

以上是关于ReactJs undefined 不是函数的主要内容,如果未能解决你的问题,请参考以下文章

null和undefined区别

reactjs-回调函数在输入键被按下时仍然没有更新背景颜色

如何点击ReactJS包装元素?

Multer 为使用 ReactJS 上传的文件返回 `undefined`

ReactJs:::Cannot read property 'map' of undefined

异步/等待 Reactjs