2016-08-09 5 views
0

私はreduxデザインごとにこの権利をしているかどうかは100%確信していません。Reactjs/Reduxに入力ボックスを接続する方法は?

import React from 'react'; 
import {connect} from 'react-redux'; 
import {bindActionCreators} from 'redux'; 
import 'materialize-css/sass/materialize.scss'; 
import NavigationContainer from './NavigationContainer'; 

import AddStorageModal from './AddStorageModal.js' 
import {loadAddStorageModal, createNewStorage} from '../actions/StorageActions.js' 
import '../styles/main.scss'; 


class App extends React.Component { 
    render() { 
    return (
     <div> 
     <NavigationContainer /> 
     <AddStorageModal {...this.props} /> 
     </div> 
    ) 
    } 
} 

function mapStateToProps(state) { 
    return { 
     storages: state.storages 
    }; 
} 

function matchDispatchToProps(dispatch){ 
    return bindActionCreators({loadAddStorageModal: loadAddStorageModal, createNewStorage: createNewStorage}, dispatch); 
} 


export default connect(mapStateToProps, matchDispatchToProps)(App); 

StorageActions

export function fetchStorage() { 
    return function(dispatch) { 
     var payload = [ 
     { 
      id: 1, 
      name: "Fridge2" 
     }, 
     { 
      id: 2, 
      name: "Closet2" 
     }, 
     { 
      id: 3, 
      name: "Car2" 
     } 
    ]; 
    dispatch({type: "Fetch_Storage", payload: payload}); 
    } 
} 

export function loadAddStorageModal(load) { 
    return function(dispatch) { 
     dispatch({type: "Load_Add_Storage_Modal", payload: load}); 
    } 
} 

export function createNewStorage(storage) { 
    return function(dispatch) { 
     dispatch({type: "New_Storage_Created", payload: storage}); 
    } 
} 

リデューサー

export default function reducer(state = { 
    fetchedStorages: [], 
    openAddStorageModal: false 
}, action) { 
    switch (action.type) { 
     case "Fetch_Storage": { 
      return { 
       fetchedStorages: action.payload 
      } 
     } 
     case "Load_Add_Storage_Modal": { 
      return { 
       openAddStorageModal: action.payload, 
       fetchedStorages: state.fetchedStorages 
      } 
     } 
     case "New_Storage_Created": { 
      return { 
       openAddStorageModal: false, 
      } 
     } 
    } 


    return state; 
} 

AddStorageModal

import React from 'react'; 

import 'materialize-css/sass/materialize.scss'; 
import 'materialize-css/js/materialize.js'; 
import 'font-awesome/scss/font-awesome.scss'; 
import '../styles/main.scss'; 

export default class AddStorageModal extends React.Component { 
    constructor() { 
     super(); 
     this.state = {storageName: ""} 
    } 
    handleChange(event) { 
     this.setState({storageName: event.target.value}); 
    } 
    render() { 
     if (this.props.storages.openAddStorageModal) { 
      $('#add-new-storage-modal').openModal({ dismissible: false }); 
     } 
     return (
      <div id="add-new-storage-modal" className="modal" > 
       <div className="modal-content"> 
        <h6>Enter your new Storage (Freezer, Pantry, etc.) </h6> 
        <div className="row"> 
         <form> 
          <div className="input-field col s12 m12 l12 "> 
           <input id="storage_name" type="text" className="validate" value={this.state.storageName} onChange={this.handleChange} /> 
           <label htmlFor="storage_name">Storage Name</label> 
          </div> 
          <br /> 
          <h4 className="center">OR</h4> 
          <h6>Enter in the sharing key you were given.</h6> 
          <div className="input-field col s12 m12 l12 "> 
           <input id="sharing_key" type="text" className="validate" /> 
           <label htmlFor="sharing_key">Sharking Key</label> 
          </div> 
         </form> 
        </div> 
       </div> 
       <div className="modal-footer"> 
        <a href="#!" className="waves-effect waves-green btn-flat left">Add</a> 
        <a href="#!" className="modal-action modal-close waves-effect waves-green btn-flat" onClick={() => this.props.loadAddStorageModal(false) }>Cancel</a> 
       </div> 
      </div> 
     ) 
    } 
} 

私は

を取得0
Uncaught TypeError: Cannot read property 'setState' of undefined 

私はこれがちょうど私がreduxを間違っていることを意味するかどうか、または私がちょっとした一般的なエラーを出したかどうかはわかりません。

+0

あなただけのコンストラクタ – QoP

答えて

2

、あなたはthisへの参照を保持する必要があります。 @nuwayは彼の答えに言ったように、関数に

  1. バインドthis:あなたは、2つのオプションがあります。

  2. this参照を保持しており、矢印の機能を使用します。onChange={ (event) => this.handleChange(event) }

+0

に '' this.handleChange = this.handleChange.bind(これ)を追加し、handleChangeをバインドするのを忘れそうです。私はちょうどそれを見た。私が設定しているサイドノートでは、setStateはただ一つのハンドルを作るために離れています。私の状態をすべて設定するためのイベントを変更しますか?私は各入力に対して関数を書く必要はありません。 – chobo2

+0

私もこの "矢関数"を試しましたが、 "未定義のプロパティ 'target'を読み取ることができません。 – chobo2

+0

@ chobo2はい、あなたは1つの関数を作ることができます。それがどの要素から来たのかを知る必要がある場合は、イベント引数をチェックすることができます。その中にターゲットがあるはずです。 – nuway

0

あなたはそうthis内部handleChange目的球が反応するコンポーネントではなく、入力要素そのものではありません、handleChangeハンドラのthisにバインドする必要があります。あなたは、一般的な機能の参照を渡すことはできません

onChange={this.handleChange.bind(this)} 
関連する問題