2016-12-16 1 views
0

React.CreateClass로 작성된 샘플을 React.Component를 확장하도록 변환하려고하지만 이벤트 핸들러가 상태를 가져 오지 않고 실패합니다. 누군가 내가 잘못하고있는 것에 대해 밝힐 수 있습니까?React.CreateClass를 React.Component로 변환하려고 시도합니다.

근무 샘플 :

var Form4 = React.createClass({ 
    getInitialState: function() { 
     return { 
      username: '', 
      password: '' 
     } 
    }, 
    handleChange: function (key) { 
     return function (e) { 
      var state = {}; 
      state[key] = e.target.value; 
      this.setState(state); 
     }.bind(this); 
    }, 
    resetForm: function() { 
     this.setState({username:'', password: ''}); 
    }, 
    changeFunkyShizzle: function() { 
     this.setState({ 
      username: 'Tom', 
      password: 'Secret' 
     }); 
    }, 
    updateToServer(e) { 
     console.log('update to server....'); 
     console.log(this.state); 
     e.preventDefault(); 
    }, 
    render: function(){ 
     console.log(JSON.stringify(this.state, null, 4)); 
     return (
      <div> 
      <FormFields unamepwd={this.state} handleChange={this.handleChange} updateChanges={this.updateToServer} /> 

     <pre>{JSON.stringify(this.state, null, 4)}</pre> 
     <button onClick={this.changeFunkyShizzle}>Change is near...</button> 
     <button onClick={this.resetForm}>Reset all the things!</button> 
     </div> 
    ); 
} 
}); 

나는 그것에서 만들려고하는 것 :

class Form5 extends React.Component { 
    constructor() { 
     super(); 
     this.state = { 
      username: '', 
      password: '' 
     }; 
    } 
    handleChange(key) { 
     return function (e) { 
      var state = {}; 
      state[key] = e.target.value; 
      this.setState(state); 
     }.bind(this); 
    } 
    changeFunkyShizzle() { 
     this.setState({ 
      username: 'Tom', 
      password: 'Secret' 
     }); 
    } 
    render() { 
     let self = this; 
     console.log(JSON.stringify(this.state, null, 4)); 
     return (
      <div> 
      <FormFields unamepwd={this.state} handleChange={self.handleChange} updateChanges={self.updateToServer} /> 

       <pre>{JSON.stringify(this.state, null, 4)}</pre> 
       <button onClick={this.changeFunkyShizzle}>Change is near...</button> 
       <button onClick={this.resetForm}>Reset all the things!</button> 
       </div>) 
     ; 
    } 
} 

Formfields : 디버깅 할 때

var FormFields = React.createClass({ 
    render: function() { 
     const upwd = this.props.unamepwd; 
     return(
     <form> 
      Username: <input 
     value={upwd.username} 
     onChange={this.props.handleChange('username')} /> 
    <br /> 
      Password: <input type="password" 
     value={upwd.password} 
     onChange={this.props.handleChange('password')} /> 
    <button onClick={this.props.updateChanges}>Go!</button> 
</form> 
     ); 
    } 
}); 

나는 눈치 그 두 경우 모두에서 thisthis.setState(state);을에 완전히 다른 것입니다. Form5에서는 Form4에서만 상태를 제공하지만, 완전한 React 객체 인 경우 Form4에서 더 많이 볼 수 있습니다.

바벨이 그것을 다른 것으로 옮겨 놓거나 내가 확장하고있는 클래스 (React.Component) 때문일 수 있습니다. 나는 React.js 세계로 첫 걸음을 내딛었으며 벌써 꽤 많은 것들을 달리고있다. 그러나 이것은 나를 위해 일하지 않고 왜 그렇게 명확한 이유가 없는지 모른다.

내가 transpile에 사용하는 gulpfile은 :

클래스 메소드와
var gulp = require('gulp'); 
var babel = require('gulp-babel'); 
var sourceMaps = require('gulp-sourcemaps'); 

gulp.task('transpile', function() { 
    gulp.src('source/**.jsx') 
     .pipe(sourceMaps.init()) 
     .pipe(babel({ "presets": "react" })) 
     .pipe(babel({ "presets": "es2015" })) 
     .pipe(sourceMaps.write('.')) 
     .pipe(gulp.dest('app/')); 
}); 

gulp.task('watchers', function() { 
    gulp.watch('source/**.jsx', ['transpile']); 
}); 

gulp.task('default', ['watchers'], function() { 
    console.log('gulp default task running'); 
}); 

답변

1

this가 자동으로 (수명주기 방법 반응 생성자를 제외하고) 클래스에 바인드되지 않습니다.

용액 1

귀속 생성자이 내부에 함수 :

constructor() { 
    super(); 
    this.state = { 
     username: '', 
     password: '' 
    }; 
    this.handleChange = this.handleChange.bind(this); 
    this.changeFunkyShizzle= this.changeFunkyShizzle.bind(this); 
} 
handleChange(key) { 
    return function (e) { 
     var state = {}; 
     state[key] = e.target.value; 
     this.setState(state); 
    }.bind(this); 
} 
changeFunkyShizzle() { 
    this.setState({ 
     username: 'Tom', 
     password: 'Secret' 
    }); 
} 

해결책 2

사용하여 화살표 기능한다. 이것이 ES6 기능이기 때문에 Babel을 correct plugin으로 구성해야 할 수 있습니다.

handleChange = (key) => (e) => { 
    var state = {}; 
    state[key] = e.target.value; 
    this.setState(state); 
} 

changeFunkyShizzle =() => { 
    this.setState({ 
     username: 'Tom', 
     password: 'Secret' 
    }); 
} 

해결 방법 3

사용 바인드 타사 라이브러리는이 작업을 수행합니다 :

+0

이 솔루션은 나를 위해 밖으로 작동 보인다. 그러나 해결책 2는 JSX가 허용하지 않는 것으로 받아 들여지지 않았습니다. – XIII

+0

Oups, 중괄호 제거하는 것을 잊었습니다. 내 대답이 업데이트되었습니다. 또한 화살표 기능으로 Babel이 필요할 수도 있습니다. ES6에서만 사용할 수 있습니다. – mbernardeau

+0

나는 그것을 나중에 시험해 볼 것이다. 나는 또한 속성으로 지시문을 통과시키지 만 succes는 필요 없다. http://stackoverflow.com/questions/41186015/react-js-passing-in-props. – XIII

관련 문제