PHP Tour Nantes - Claire Coloma et Suzanne Favot - 18 mai 2017
PHP Tour Nantes - Claire Coloma et Suzanne Favot - 18 mai 2017
class TodoList extends Component {
render() {
return (
<div className="well">
/* Code du rendu */
</div>
);
}
}
<Todo done={false} item={item} />
class Todo extends Component {
constructor() {
super();
this.state = {
visible: true,
};
}
markAsDone() {
this.setState({
visible: false,
});
}
render() {
if (!this.state.visible) {
return null;
}
return (
<li>
<span>{this.props.item}</span>
<button onClick={this.markAsDone.bind(this)}>
Fait
</button>
</li>
);
}
}
{% extends "base.html" %}
{% block content %}
<h1>Bienvenue</h1>
{% include 'AppBundle:Homepage:content.html.twig' %}
{% endblock %}
Composants React déclarés à part proprement et compilés en un fichier
{# layout.html.twig #}
{% block body %}
<div
id="search-page"
data-categories="{{ categories|json_encode }}"
></div>
{% endblock %}
{% block javascripts %}
<script type="text/javascript" src="{{ asset('searchpage.js') }}"></script>
{% endblock %}
// index.js
import React from 'react';
import ReactDOM from 'react-dom';
import SearchPage from './SearchPage.jsx';
const searchPageElement = document.querySelector('#search-page');
const getData = (name, json = true) => {
const value = searchPageElement.getAttribute(`data-${name}`);
return json ? JSON.parse(value) : value;
};
const element = React.createElement(SearchPage, {
categories: getData('categories'),
});
ReactDOM.render(element, document.getElementById('search-page'));
On veut mettre du React sur la homepage => problème : pas de référencement => solution : ?
Avec Javascript
Sans Javascript
Nuancer à mort : la plupart des robots lisent le js et l'immense majorité des gens aussi
Transition vers React rendu serveur
exec('node ./test.js', $output);
$v8 = new V8Js();
$v8->answer = 41;
$js = "var life = {}; life.answer = PHP.answer; life.answer++; life.answer;";
// Affiche 42
$v8->executeString($js);
$phpexecjs = new PhpExecJs();
$js = "Math.min(1, 2)";
// Affiche 1
$phpexecjs->evalJs($js);
{{ react_component('HomePage', {'rendering': 'server_side'}) }}
{{ react_component('HomePage', {'rendering': 'client_side'}) }}
{{ react_component('HomePage', {'rendering': 'both'}) }}
On crée les composants React à part
On register les composants à rendre dans Twig grâce à React on Rails
// registration.js
import ReactOnRails from 'react-on-rails';
import HomePage from './components/HomePage';
ReactOnRails.register({ HomePage });
On build le code Javascript (par exemple avec Webpack) dans deux fichiers server-bundle.js et client-bundle.js.
Enfin, on appelle nos composants en leur passant les props souhaitées.
{{ react_component('HomePage', {'props': {'items': items}, 'rendering': 'both'}) }}