2016-04-05 16 views
2

Ich versuche zu verstehen, wie man Redux in dem Fall verwendet, in dem eine Prop, die in eine Komponente übergeben wird, verwendet werden soll, um den Status der Anwendung zu ändern.Wie verwende ich Redux, wenn eine Stützfunktion den Zustand ändert?

Ich habe ein funktionierendes Beispiel .

let Input = ({handleChange}) => (
    <input type="text" onChange={handleChange('mySpecialInput')} /> 
) 

let Text = ({message, color}) => (
    <span style={{color}}>{message}</span> 
) 

let App = ({message, color, handleChange}) => (
    <div> 
    <Text message={message} color={color} /> <br /> 
    <Input handleChange={handleChange} /> 
    </div> 
) 

class ConnectedApp extends React.Component { 
    constructor(props) { 
    super(props) 
    this.state = { 
     color: 'orange', 
     message: 'Hello World' 
    } 
    this.handleChange = this.handleChange.bind(this) 
    } 
    handleChange(id) { 
    return (event) => { 
     console.log(id) 
     if (id === 'mySpecialInput') { 
     this.setState({'color': event.target.value}) 
     } 
    } 
    } 
    render() { 
    return (
     <App 
     message={this.state.message} 
     color={this.state.color} 
     handleChange={this.handleChange} /> 
    ) 
    } 
} 

ReactDOM.render(
    <ConnectedApp/>, 
    document.getElementById('react_example') 
); 

Wie würde etwas so einfach mit redux arbeiten?

+0

Funktioniert das zweite Beispiel nicht? Ich verstehe deine Frage nicht ganz. – mjohnsonengr

+0

@mjohnsongr das zweite Beispiel wurde direkt aus dem [Simple-Redux-Beispiel] (https://github.com/jackielii/simples-redux-example/blob/master/index.js) genommen, nur aktualisiert, denke ich habe es herausgefunden, aber immer noch nicht gerendert. – ThomasReggi

+0

Es wird wahrscheinlich nicht gerendert, weil App keine Nachrichtenrequisite erhält. – mjohnsonengr

Antwort

2

Hier ist der Code oben gebaut mit redux!

Working Example

let {createStore} = Redux 
let {connect, Provider} = ReactRedux 

// React component 
let Input = ({handleChange}) => (
    <input type="text" onChange={handleChange('mySpecialInput')} /> 
) 

let Text = ({message, color}) => (
    <span style={{color}}>{message}</span> 
) 

let App = ({message, color, handleChange}) => (
    <div> 
    <Text message={message} color={color} /> <br /> 
    <Input handleChange={handleChange} /> 
    </div> 
) 

// Action 

const CHANGE_COLOR = 'CHANGE_COLOR' 

function changeColorAction(color) { 
    return { 
    type: CHANGE_COLOR, 
    color 
    } 
} 

// Reducer 
function reducer(state = {color: "#ffa500"}, action) { 
    let count = state.count 
    switch (action.type) { 
    case CHANGE_COLOR: 
     return { color: action.color } 
    default: 
     return state 
    } 
} 

// Store 
let store = createStore(reducer) 

// Map Redux state to component props 
function mapStateToProps(state) { 
    return { 
    color: state.color, 
    message: "Hello World" 
    } 
} 

function changeColorDispatcher (dispatch) { 
    return (id) => { 
    return (event) => { 
     if (id === 'mySpecialInput') { 
     return dispatch(changeColorAction(event.target.value)) 
     } 
    } 
    } 
} 

// Map Redux actions to component props 
function mapDispatchToProps(dispatch) { 
    return { 
    handleChange: changeColorDispatcher(dispatch) 
    } 
} 

// Connected Component 
let ConnectedApp = connect(
    mapStateToProps, 
    mapDispatchToProps 
)(App) 

ReactDOM.render(
    <Provider store={store}> 
    <ConnectedApp/> 
    </Provider>, 
    document.getElementById('react_example') 
); 
+1

Woot! Ich bin froh, dass es funktioniert hat! – mjohnsonengr

+0

Warum machst du dir den Action-Creator als Requisite den Baum hinunter? Das scheint so falsch zu sein. – whitep4nther

+0

@ whitep4nther welche Variable ist der Aktionsersteller? Was ist meine Alternative? – ThomasReggi

-1

Sie können einfach jede Ihrer Komponenten einzeln verbinden statt mit connect() auf dem Top-Level-Komponente und vorbei an den Stützen in der Hierarchie Baum.

Dies wird viel praktischer.
See a working example!

Verwandte Themen