Introduction à
React et Redux

9 Février 2019

Tom Darneix

Tom Darneix

22 ans

Développeur frontend

Scrum Master Certifié

Contributeur open-source

react-d3-heatmap

Tom Darneix

Sommaire

Introduction à React

Gérer les données avec Redux

Démo (Todo App)

Qu'est ce que React ?

Bibliothèque front-end

Facebook (2013)

Single Page Application (SPA)

Composants

Eco-système

Javascript (.jsx)

Redux

React router

React bootstrap

State of JS 2018

Pourquoi React ?

Principes fondamentaux

JSX

// index.jsx ou index.js
import React from 'react'
import ReactDOM from 'react-dom'

function formatName(user) {
  return user.firstName + ' ' + user.lastName;
}

const user = {
  firstName: 'Helen',
  lastName: 'Ripley'
};

const element = (
  <h1>
    Hello, {formatName(user)}!
  </h1>
);

ReactDOM.render(
  element,
  document.getElementById('root')
);
<!--index.html-->
<html>
    <head>
        <title>Hello</title>
    </head>
    <body>
        <div id="root"></div>
    </body>
</html>
<!--HTML généré dans le DOM-->
<html>
    <head>
        <title>Hello</title>
    </head>
    <body>
        <div id="root">
            <h1>
                Hello, Helen Ripley!
            </h1>
        </div>
    </body>
</html>

Principes fondamentaux

JSX



function tick() {
  const element = (
    <div>
      <h1>Hello, world!</h1>
      <h2>It is {new Date().toLocaleTimeString()}.</h2>
    </div>
  );
  ReactDOM.render(element, document.getElementById('root'));
}

setInterval(tick, 1000);

Principes fondamentaux

Composants

A peu près...

Principes fondamentaux

Composants fonctionnel

const RenderForm = () => (
    <form>
        <input type="text" />
        <input type="submit" value="Submit" />
        <input type="cancel" value="Cancel" />
    </form>
);

ReactDOM.render(
    <RenderForm />,
    document.getElementById('root')
);

Principes fondamentaux

Composants de classe

class RenderForm extends React.Component {
    constructor(props) {
        super(props)
    }

    render() {
        return (
            <form>
                <input type="text" />
                <input type="submit" value="Submit" />
                <input type="cancel" value="Cancel" />
            </form>
        )
    }
}

ReactDOM.render(
    <RenderForm />,
    document.getElementById('root')
);

Principes fondamentaux

Props

class RenderForm extends React.Component {
    constructor(props) {
        super(props)
    }

    render() {
        const { inputValue, submitValue, cancelValue } = this.props
        return (
            <form>
                <input type="text" value={inputValue} />
                <input type="submit" value={submitValue} />
                <input type="cancel" value={cancelValue} />
            </form>
        )
    }
}

ReactDOM.render(
    <RenderForm inputValue='hello' submitValue='Go' cancelValue='Do not submit' />,
    document.getElementById('root')
);

Principes fondamentaux

Props

const RenderForm = props => (
    <form>
        <input type="text" value={props.inputValue} />
        <input type="submit" value={props.submitValue} />
        <input type="cancel" value={props.cancelValue} />
    </form>
)

ReactDOM.render(
    <RenderForm inputValue='hello' submitValue='Go' cancelValue='Do not submit' />,
    document.getElementById('root')
);

Principes fondamentaux

State

class RenderForm extends React.Component {
    constructor(props) {
        super(props)
        this.state = {
            inputValue: ''
        }
    }

    handleChangeInput = e => {
        this.setState({ inputValue: e.target.value })
    }

    render() {
        return (
            <div>
                <input
                    type="text"
                    value={this.state.inputValue}
                    onChange={this.handleChangeInput}
                />
                <p><b>Input value : </b>{this.state.inputValue}</p>
            </div>
        )
    }
}

Cycle de vie

Mise en place

npm i -g create-react-app

create-react-app test-react

Mise en place

Manuel

Webpack

Browserify JS

Comment gérer des structures de données complexes ?

Redux

Redux

Centralisé (store)

Store

Stocke les structures de données

console.log(store.getState())

/* Prints
{
  todo : {
    visibilityFilter: 'SHOW_ALL',
    todos: [
        {
          text: 'Consider using Redux',
          completed: true,
        },
        {
          text: 'Keep all state in a single tree',
          completed: false
        }
    ]
  },
  user : {
    firstName: 'Helen',
    lastName: 'Ripley'
  }
}
*/

Actions

Modification du Store Redux

store.dispatch({
  type: 'ADD_TODO',
  todo: { text: 'Faire un truc', completed: false } 
})

Reducers

Spécifie le comportement de modification du store

// reducers/todoReducer.js

const initialState = {
    visibilityFilter: 'SHOW_ALL',
    todos: []
}

function todo(state = initialState, action) {
  switch (action.type) {
    case 'ADD_TODO':
      const prevTodos = Array.from(state.todos)
      prevTodos.push(action.todo)
      return {
        ...state,
        todos: prevTodos
      }
    default:
      return state
  }
}

Mise en place de Redux

// reducers/index.js

import { combineReducers } from 'redux'
import todo from './todoReducer'

export default combineReducers({
  todo
})

Reducers

Mise en place de Redux

// store/index.js

import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import rootReducer from '../reducers';
import logger from 'redux-logger'

export default function configureStore(initialState) {
    return createStore(
        rootReducer,
        initialState,
        applyMiddleware(thunk, logger)
    );
}

Store

Mise en place de Redux

// index.js

{...}

import { Provider } from "react-redux";
import configureStore from './store/'

const store = configureStore()

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>, document.getElementById('root'));
{...}

Connexion à React

Pour aller plus loin...

https://reactjs.org

Cycle de vie des composants

Eslint

Prettier

Jest, Enzyme

Rekit

React Native

Pour le fun !

react-spectacle

react-360

Demo (Todo App)

Merci :D

Introduction à React et Redux

By thebardapnk

Introduction à React et Redux

  • 80