Skip welcome & menu and move to editor
Welcome to JS Bin
Load cached copy from
 
<!DOCTYPE html>
<html>
<head>
<meta name="description" content="React+Redux focus after action">
<script src="//fb.me/react-0.14.6.js"></script>
<script src="//fb.me/react-dom-0.14.6.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/redux/3.0.6/redux.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-redux/4.0.6/react-redux.min.js"></script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>JS Bin</title>
</head>
<body>
<div id="root"></div>
</body>
</html>
 
// noprotect
const { Component } = React
const { createStore, combineReducers, applyMiddleware } = Redux
const { Provider, connect } = ReactRedux
const START_COMPOSING = 'START_COMPOSING'
const STOP_COMPOSING = 'STOP_COMPOSING'
class Root extends Component {
  render() {
    const { store } = this.props
    
    return (
      <Provider store={store}>
        <App />
      </Provider>
    )
  }
}
const appActions = {
  startComposing() {
    return { type: START_COMPOSING }
  },
  stopComposing() {
    return { type: STOP_COMPOSING }
  }
}
@connect(
  state => ({ isComposing: state.app.isComposing }),
  appActions
)
class App extends Component {
  render() {
    const { isComposing, something } = this.props
  
    return (
      <div>
        <button onClick={::this._onCompose}>Compose</button>
        <button onClick={::this._onStopCompose}>Stop</button>
      
        [isComposing={isComposing.toString()}]
    
        {isComposing ?
          <Composer ref={c => {
            this._composer = c
            this._composer && this._composer.focus()
          }} />
          : null
        }
      </div>
    )
  }
  
  _onCompose() {
    this.props.startComposing()
   
    this._composer && this._composer.focus()
  }
  _onStopCompose() {
    this.props.stopComposing()
  }
}
class Composer extends Component {
  render() {
    return (
      <div>
        <input type="text" ref="input" />
      </div>
    )
  }
  
  focus() {
    this.refs.input.focus()
  }
}
function app(state={ isComposing: false, something: 0 }, action) {
  switch (action.type) {
    case START_COMPOSING:
      return { ...state, isComposing: true }
      
    case STOP_COMPOSING:
      return { ...state, isComposing: false }
      
    default:
      return state
  }
}
const rootReducer = combineReducers({ app })
let createStoreWithMiddleware = createStore
const store = createStoreWithMiddleware(rootReducer)
ReactDOM.render(<Root store={store} />, document.getElementById('root'))
                
console.clear()
Output

You can jump to the latest bin by adding /latest to your URL

Dismiss x
public
Bin info
eladopro
0viewers