2017-03-05 10 views
0

私はReactJSを学んでいます。入力テキストと「確認」ボタンを表示するWebアプリケーションを作成し、押されると、新しい入力を削除する「戻る」ボタンが付いた2番目の入力テキストが表示されます。 2番目が表示されているときは、最初の入力と最初のボタンが無効になります。ReactJSのボタンを正しく無効にするには?

ただし、私の現在のスクリプトは受け入れられません。私は関数をFormRender関数に渡し、FormRenderオブジェクト自体に "disabled"( "予期しないトークン"を発見したと主張する)というプロパティを渡すことに問題があります。

もっと良いアプローチはありますか?

function FormRender (props) { 
    return (
     <div> 
      <input type = "text" placeholder = {this.props.holder} {this.props.disable} /> 
      <button onClick = {this.props.Click()} {this.props.disable} > {this.state.value} </button> 
     </div> 
    ); 
}; 

var R = React.createClass ({ 
    getInitialState: function() { 
     return { names: [], disable: false } 
    }, 
    update: function() { 
     return this.state.disable ? "disabled" : ""; 
    }, 
    componentDidMount: function() { 
     var a = this.state.names; 
     a.push (<FormRender holder = 'Name' value = 'Confirm' Click = {this.In}, disable: {this.update} />); 
     this.setState ({ names: a }); 
     this.forceUpdate(); 
    }, 
    In: function() { 
     var a = this.state.names; 
     this.setState ({ disable: true }); 
     a.push (<FormRender holder = 'Surname ' value = 'Back' Click = {this.Out} disable: "" />); 
     this.setState ({ names: a }); 
     this.forceUpdate(); 
    }, 
    Out: function() { 
     var a = this.state.names; 
     this.setState ({ disable: false }); 
     a.splice(a.length-1,1); 
     this.setState ({ names: a }); 
     this.forceUpdate(); 
    }, 
    render: function() { 
     return (
      <div> 
       {this.state.names} 
      </div> 
     ); 
    } 
}); 
+0

'disabled = {true/false}'を使うことができます。文字列変換の必要はありません。 [例](http://stackoverflow.com/a/41488965/6941627)。 –

+0

@Rocコードに間違いがありません。 1.機能コンポーネントに状態がありません: '{this.state.value}'は動作しません 2. FormRenderでは、最初のパラメータでpropsにアクセスできるので、 'this.props.disable 'but 'props.disable' 3.' onClick'のようなイベントハンドラを割り当てるときには、function: 'onClick = {this.props.Click}'(大括弧なし)を割り当ててください。 4.小道具を定義するとき、 : 'を代入演算子として使用します。ほとんどの場所では「=」を使用しますが、「:」を使用する場所はほとんどありません。あなたはそれを変更する必要があります。 おそらく 'クリック= {this.In.bind(this)} 'を使用してください。 – Grajek

+0

"予期しないトークン "エラーを忘れてしまいました。 FormRenderで 'disbale = {this.props.disable}'を使用してください。 – Grajek

答えて

0

私はそれが

function FormRender (props) { 
return (
    <div> 
     <input 
      type="text" 
      placeholder={props.holder} 
      disabled={props.disable()} 
     /> 
     <button 
      onClick={props.click} 
      disabled={props.disable()} 
     > 
      {props.value} 
     </button> 
    </div> 
); 
}; 

var R = React.createClass ({ 
getInitialState: function() { 
    return {names: [], disable: false} 
}, 

update: function() { 
    return this.state.disable; 
}, 

componentDidMount: function() { 
    var a = this.state.names; 
    var form = { 
     holder: 'Name', 
     value: 'Confirm', 
     click: this.In, 
     disable: this.update 
    }; 

    a.push(form); 
    this.setState({names: a}); 
}, 
In: function() { 
    if (this.state.names.length > 1) { 
     return; 
    } 

    var a = this.state.names; 
    var form = { 
     holder: 'Surname', 
     value: 'Back', 
     click: this.Out, 
     disable: function() { 
      return false 
     } 
    } 

    this.setState({disable: true}); 
    a.push(form); 
    this.setState({names: a}); 
}, 
Out: function() { 
    var a = this.state.names; 
    this.setState({disable: false}); 
    a.splice(a.length-1,1); 
    this.setState({names: a}); 
}, 
render: function() { 
    return (
     <div> 
      {this.state.names.map(function (el) { 
       return (<FormRender 
        holder={el.holder} 
        value={el.value} 
        click={el.click} 
        disable={el.disable} 
       />); 
      })} 
     </div> 
    ); 
} 
}); 

https://jsfiddle.net/69z2wepo/72509/

何をしたい私の例である場合は、あなたのコードでは、多くの構文エラーを持っていることを確認していません。 私はlinterを使うことをお勧めします:)

+0

信じられないかもしれませんが、それと同じ種類のエラーです。それはブラウザの問題ですか? Firefox 51.0.1でテストしています。 "マップ"とは何か、また、関数内で渡す理由は、 "更新"ではなく新しい関数オブジェクトとして無効にすることです。 エラーは{props.holder} – Roc

関連する問題