μ΄ λ¬Έμ κ° μ΄λ―Έ ν΄κ²° λ κ²½μ° μ¬κ³Όλ립λλ€. κ·Έλ¬λ λ¬Έμ μ ν€μλ κ²μμ λμμ΄λλ λ΄μ©μ μ°Ύμ§ λͺ»νμ΅λλ€.
κ΅¬μ± μμ νμΌμμ store.dispatch(someAction)
λ₯Ό νΈμΆνλ €λ κ²½μ° store
μΈμ€ν΄μ€μ μ‘μΈμ€νλ μ¬λ°λ₯Έ λ°©λ²μ 무μμ
λκΉ?
μ§κΈμ λ€μκ³Ό κ°μ΄ μλνμ§λ§ μ¬λ°λ₯Έ μ κ·Ό λ°©μμΈμ§ νμ€νμ§ μμ΅λλ€.
index.jsx :
...
const store = applyMiddleware(
loggingMiddleware, // log every action
thunk // making API requests from actions
)(createStore)(reducer);
export {
store
};
...
Controls.jsx
import {store} from './index.jsx';
import * as actions from './actions';
...
let clickHandler = function(node, data) {
store.dispatch(actions.nodeClicked(data))
}
export const Controls = React.createClass({
render: function() {
// React component gets rendered, and it passes the clickHandler to a
// function that attaches it to a D3 visualization
}
});
μ΄μ κ°μ μμ μ μμΆ / μμ
νλλ° λ¬Έμ κ° μμ΅λκΉ? React μ»΄ν¬λνΈμ μΌλΆλ‘ ν΄λ¦ νΈλ€λ¬λ₯Ό μμ±νκ³ this.context.store
νΈμΆ ν μ μλ€κ³ μκ°νμ§λ§ μ€μ λ‘λ D3 μκ°νλ‘ μ λ¬λλ μ½ 12 ββκ°μ λ€λ₯Έ μ΄λ²€νΈ νΈλ€λ¬κ° μμΌλ―λ‘ μ€μ λ‘λ μ€μ©μ μ΄μ§ μμ΅λλ€. μν.
λμ€ν¨μΉλ₯Ό ββκ΅¬μ± μμμ λ°μΈλ©νλ λμ°λ―Έ λ©μλλ https://github.com/rackt/react-redux λ₯Ό νμΈνμμμ€.
νΉν https://redux.js.org/docs/basics/UsageWithReact.htmlμμ
connect () νΈμΆλ‘ λν λ λͺ¨λ κ΅¬μ± μμλ λμ€ν¨μΉ ν¨μλ₯Ό propμΌλ‘ μμ νκ³ μ μ μνμμ νμν λͺ¨λ μνλ₯Όλ°μ΅λλ€.
μ΄μ κ°μ μμ μ μμΆ / μμ νλλ° λ¬Έμ κ° μμ΅λκΉ?
μλ²μμ μμ²λ§λ€ λ€λ₯Έ store
μΈμ€ν΄μ€λ₯Ό κ°κΈ°λ₯Ό μνκΈ° λλ¬Έμ μλ²μμ μ±μ λ λλ§νλ κ²½μ° μλνμ§ μμ΅λλ€. μ΄κ²μ΄ μ°λ¦¬κ° λ¬Έμμμμ΄ μ κ·Ό λ°©μμ κΆμ₯νμ§ μλ μ΄μ μ
λλ€.
λμ μ΄κ²μνμ§ μλ μ΄μ λ 무μμ λκΉ?
import { Component } from 'react';
import { connect } from 'react-redux';
import * as actions from './actions';
let createHandlers = function(dispatch) {
let onClick = function(node, data) {
dispatch(actions.nodeClicked(data))
};
return {
onClick,
// other handlers
};
}
class Controls extends Component {
constructor(props) {
super(props);
this.handlers = createHandlers(this.props.dispatch);
}
render() {
// pass this.handlers anywhere you'd like
}
}
export default connect()(Controls);
@gaearon λ©μ§λ€μ , κ°μ¬ν©λλ€!
@gaearon μ€μ λ‘ μ¬μ© this.props.dispatch
undefined
λ₯Ό λ°κ³ μμ΅λλ€.
λ΄ μ½λμ κ΄λ ¨ λΆλΆ :
import React from 'react';
import {Component} from 'react';
import {connect} from 'react-redux';
import * as vizActions from './vizActions';
import viz from './lib/viz';
let createHandlers = function(dispatch) {
return {
click: function(DOMNode, data) {
// Getting undefined here
dispatch(vizActions.setSelectedNode(data));
}
};
}
class Viz extends Component {
constructor(props) {
super(props);
console.log(this.props.dispatch); // <- Getting undefined here
// Passing the redux dispatch to be used in handlers function
this.handlers = createHandlers(this.props.dispatch);
}
componentDidMount() {
// Create Viz
}
componentDidUpdate() {
// Update Viz Data, passing in this.handlers
}
render() {
return <div id="viz"></div>;
}
};
function mapStateToProps(state) {
return {
// Pass the network used for the viz as a prop
network: state.get('visualization').get('network')
};
}
export const VizContainer = connect(mapStateToProps, vizActions)(Viz);
κ·Έλ¬λ λ λ€λ₯Έ λ¬Έμ λ₯Ό μ½μ ν (https://github.com/rackt/redux/issues/239) λλ μ€μ λ‘ λ΄ νλ κ²°ν©νκ³ μμμ κΉ¨λ¬μλ€ this.props
λ₯Ό ν΅ν΄ connect()
λ΄κ° ν μ μμΌλ―λ‘, createHandlers()
νΈμΆ ν λ νμν μ‘°μΉλ₯Ό μ λ¬νκΈ° λ§νλ©΄λ©λλ€. μλ§λ μ΄κ²μ΄ μ΅μ μ λ°©λ²μ μλμ§λ§ μ§κΈμ μλν©λλ€.
...
let createHandlers = function(action) {
return {
click: function(DOMNode, data) {
// This works now
action(data);
}
};
}
class Viz extends Component {
constructor(props) {
super(props);
// Passing the redux dispatch to be used in handlers function
this.handlers = createHandlers(this.props.setSelectedNode); // passing action creator function
}
...
μ€μ λ‘ μλν ν this.props.dispatchμ λν΄ μ μλμ§ μμμ΅λλ€.
λ΄κ° κ²μ ν μ½λλ₯Ό μ€ννκ³ μμ§ μκΈ° λλ¬Έμ
λλ€. λ΄κ° κ²μ ν μ½λμμ connect
λ λ λ²μ§Έ λ§€κ° λ³μλ₯Όλ°μ§ λͺ»νμ΅λλ€. vizActions
ν΅κ³Όν©λλ€. κ·Έλ κΈ° λλ¬Έμ dispatch
λ°μ§ λͺ»ν©λλ€. connect
ν΅νμμ vizActions
λ₯Ό μ κ±°νλ©΄λ°μ μ μμ΅λλ€.
λ κ°μ§ λ°©λ² λͺ¨λ λμΌνλ―λ‘ κ°μ₯ μ μ½λ λ°©λ²μ μ¬μ©νμμμ€.
: +1 : μ΄μ λ§μ΄ λλ€μ. λμ μ£Όμ μ κ°μ¬ν©λλ€!
νν°μ λ¦μμ§λ§ λμ€μ λκ΅°κ° (λλ₯Ό ν¬ν¨νμ¬) λμμ΄ λ κ²½μ°λ₯Ό λλΉνμ¬ λ΅μ₯ν©λλ€.
μ¬μ©μ μ μ mapDispatchToProps
μ΄ νμν κ²½μ° (μ°κ²°μ μν΄ μ λ¬ λ λ λ²μ§Έ λ§€κ° λ³μ) dispatch
λ₯Ό ν€ μ€ νλλ‘ λͺ
μ μ μΌλ‘ μΆκ°ν©λλ€.
const mapDispatchToProps = (dispatch) => {
return {
dispatch,
// ... other custom mapped dispatch functions ...
myFunction: (myParam) => {
dispatch(State.Actions...)
},
}
}
export default connect( mapStateToProps, mapDispatchToProps )(Viz);
μλ
νμΈμ. λλ λνμ΄ λ¬Έμ κ° μμ΅λλ€.
@gaearon , κ·νμ μλ΄μ κ°μ¬λ립λλ€. κ·νμ μ루μ
μ μ¬μ©νμ§λ§ μ΄ν΄νκ³ μ¬μ©ν μ μμ΅λλ€.
this.handlers
μ¬μ© λ°©λ²μ λͺ¨λ₯΄κ² μ΅λλ€. μ¬μ©μκ° μΉ΄λλ₯Ό ν΄λ¦νλ©΄ ν΄λΉ μΉ΄λ IDλ₯Ό λΆλͺ¨μ κ΅¬μ± μμλ‘ λ³΄λ΄κ³ μμ
μ μ€νν©λλ€.
import React , { Component } from 'react';
import { Col } from "react-bootstrap";
import { connect } from 'react-redux';
import Home from "../components/Home";
import { fetchHome, asideArticle } from "../actions/index";
let createHandlers = function(dispatch) {
let onClick = function(node, articleId) {
dispatch(asideArticle(articleId))
};
return {
onClick
};
}
class HomeContainer extends Component {
constructor(props) {
super(props);
this.handlers = createHandlers(this.props.dispatch);
console.log('constructor => this.props.dispatch => Result => dispatch is undefined);
}
componentDidMount() {
this.props.fetchHome();
}
render() {
const { homeData, article } = this.props;
//
return (
<Col>
<Home homeData={homeData} asideArticle={(articleId) => asideArticle(articleId) } />
</Col>
);
}
}
const mapStateToProps = state => ({
homeData : state.home,
article: state
});
function loadData(store){
return store.dispatch(fetchHome());
}
export default {
loadData,
component: connect(mapStateToProps, { fetchHome, asideArticle })(HomeContainer)
}
this.handlers
λ₯Ό μ¬μ©νκ³ ν΄λ¦ μ΄λ²€νΈλ₯Ό μ λ¬ν ν articleId
λ₯Ό μ λ¬νμ¬ μ λ¬νλ €λ©΄ μ΄λ»κ²ν΄μΌν©λκΉ?
node
λ§€κ° λ³μλ function(node, articleId)
μμ 무μμ μλ―Ένλ©° μ΄λ€ μν μν©λκΉ?
@EhsanFahami :
μ΄κ²μ μ§μ μμ€ν μ΄ μλλΌ λ²κ·Έ μΆμ κΈ°μ λλ€. μ¬μ©λ²μ λν μ§λ¬Έμ λ λ§μ μ¬λλ€μ΄ λμμ μ€ μ€λΉκ°λμ΄μλ Stack Overflow λλ Reactifluxλ₯Ό μ¬μ©νμμμ€. μλ§λ λ λμ λ΅λ³μ λ 빨리 μ»μ μμμ κ²μ λλ€. κ°μ¬!
κ°μ₯ μ μ©ν λκΈ
μλ²μμ μμ²λ§λ€ λ€λ₯Έ
store
μΈμ€ν΄μ€λ₯Ό κ°κΈ°λ₯Ό μνκΈ° λλ¬Έμ μλ²μμ μ±μ λ λλ§νλ κ²½μ° μλνμ§ μμ΅λλ€. μ΄κ²μ΄ μ°λ¦¬κ° λ¬Έμμμμ΄ μ κ·Ό λ°©μμ κΆμ₯νμ§ μλ μ΄μ μ λλ€.λμ μ΄κ²μνμ§ μλ μ΄μ λ 무μμ λκΉ?