deku / le mini

Quelques infos

créé part Anthony Short 

le 08/10/2014

habite à San Francisco
travaille chez Segment

version : V2 en RC
2 310 stars

Philosophie deku

  • Virtual DOM
     
  • Approche purement fonctionnelle
     
  • Aucun state
     
  • API minimal
     
  • IE10+

Utilisation du JSX

import {element} from 'deku';
import {string as toStyle} from 'to-style';

function render({props, context}) {
  const style = {backgroundImage: 'url('+props.image+')'};
  let cardClassName = 'card';
  return (
    <li id={props.id} class={cardClassName}>
      <div class="card-image" style={toStyle(style)}></div>
      <div>
        <div>{pros.title}</div>
        <div class="card-type">{props.type}</div>
      </div>
    </li>
  );
}

const propTypes = {
  id: {type: 'integer'},
  image: {type: 'string'},
  title: {type: 'string'},
  type: {type: 'string'},
};

export default {propTypes, render};
import React, {PropTypes} from 'react';

const Card = ({image, id, title, type}) => {
  let style = {backgroundImage: 'url('+image+')'};
  let cardClassName = "card";
  return (
    <li id={id} className={cardClassName}>
      <div className="card-image" style={style}></div>
      <div>
        <div>{title}</div>
        <div className="card-type">{type}</div>
      </div>
    </li>
  );
}

Card.propTypes = {
    id: PropTypes.number,
    image: PropTypes.string,
    title: PropTypes.string,
    type: PropTypes.type,
  };

export default Card;

Lifecycle

import {element} from 'deku';
import {string as toStyle} from 'to-style';

function onCreate({props, context}){
    console.log('create element');
}

function onUpdate({props, context}){
    console.log('update element');
}

function onRemove({props, context}){
    console.log('remove element');
}

function render({props}) {
  const style = {backgroundImage: 'url('+props.image+')'};
  let cardClassName = 'card';
  return (
    <li id={props.id} class={cardClassName}>
      <div class="card-image" style={toStyle(style)}></div>
      <div>
        <div>{props.title}</div>
        <div class="card-type">{props.type}</div>
      </div>
    </li>
  );
}

const propTypes = {
  id: {type: 'integer'},
  image: {type: 'string'},
  title: {type: 'string'},
  type: {type: 'string'},
};

export default {propTypes, render, onCreate, onUpdate, onRemove};
import React, {Component, PropTypes} from 'react';

class Card extends Component {

  static propTypes = {
    id: PropTypes.number,
    image: PropTypes.string,
    title: PropTypes.string,
    type: PropTypes.type,
  };

  componentDidMount() {
    console.log('mount');
  }

  componentDidUpdate() {
    console.log('update');
  }

  componentWillUnmount() {
    console.log('unmount');
  }

  render() {
    let style = {
      backgroundImage: 'url(' + this.props.image + ')',
    };
    let cardClassName = "card";
    return (
      <li id={this.props.id} className={cardClassName}>
        <div className="card-image" style={style}></div>
        <div>
          <div>{this.props.title}</div>
          <div className="card-type">{this.props.type}</div>
        </div>
      </li>
    );
  }

}

export default Card;

Les Events

import {element} from 'deku';

function render () {
  return <button onClick={save}>Submit</button>;
}

function save (event) {
  // event = MouseClick dom event
}

export {render}
import React from 'react';

Element = () => {
  return <button onClick={save}>Submit</button>;
}

function save (event) {
  // event = MouseClick dom event
}

export default Element;

Le Rendering

import React from 'react';
import ReactDOM from 'react-dom';
import {Router, Route} from 'react-router';
import App from './App';

ReactDOM.render(<App />, 
  document.getElementById('body'));
import {dom, element} from 'deku';
import App from './App';
const {createRenderer} = dom;
const render = 
  createRenderer(document.getElementById('body'));

render(<App />);

Avec Redux

import {dom, element} from 'deku';
import App from './App';
import Store from './Store';
const {createRenderer} = dom;
const render = 
  createRenderer(document.getElementById('body'), 
    Store.dispatch);

Store.subscribe(() => {
  render(<App />, Store.getState());
});

render(<App />, Store.getState());
// App.js

import {element} from 'deku';

let save = dispatch => event => {
  dispatch({
    type: 'SAVED'
  })
}

function render ({dispatch}) {
  return <button onClick={save(dispatch)}>X</button>;
}

export {render}
import React from 'react';
import ReactDOM from 'react-dom';
import {Router, Route} from 'react-router';
import App from './App';

ReactDOM.render(<App />, 
  document.getElementById('body'));
// App.js
import React from 'react';
import {sendAction} from './Action';

function save(){
  sendAction();
}

const App = () => 
  return <button onClick={save}>X</button>;

export default App;
//Action.js
import Store from './Store';

export const sendAction = () {
  Store.dispatch({
    type: 'SAVED',
  });
}
 

Conclusion

  • Utilisation de JSX très appréciable
     
  • S'intègre très bien avec Redux
     
  • Léger, pure functions
     
  • Besoin de nombreuses libs (styling, routing...)
     
  • Lifecycle beaucoup moins puissant que React
     
  • Maturité de la librairie, encore des bugs

deck

By Florent DUVEAU

deck

  • 1,050