Slide 1

Slide 1 text

It's like Vue or React. Without the JavaScript.

Slide 2

Slide 2 text

Okay, there's some JS. 2/26

Slide 3

Slide 3 text

About me ! Christian Leo-Pernold "#$%&'(⛰*+,- . @mazedlx ⭐ github.com/mazedlx 0 mazedlx.net 1 repod.at 3/26

Slide 4

Slide 4 text

What is Livewire? 4/26

Slide 5

Slide 5 text

Livewire is a full-stack framework for Laravel that makes building dynamic front-ends as simple as writing vanilla PHP (literally). — Caleb Porzio (@calebporzio) 5/26

Slide 6

Slide 6 text

Example Vue component
+ - {{ count }}
export default { data() { return { count: 0 } }, methods: { increment() { this.count++; }, decrement() { this.count--; } } }; 6/26

Slide 7

Slide 7 text

Example Vue component
+ - {{ count }}
export default { data() { return { count: 0 } }, methods: { increment() { this.count++; }, decrement() { this.count--; } } }; 6/26

Slide 8

Slide 8 text

Example Vue component
+ - {{ count }}
export default { data() { return { count: 0 } }, methods: { increment() { this.count++; }, decrement() { this.count--; } } }; 6/26

Slide 9

Slide 9 text

Example Vue component
+ - {{ count }}
export default { data() { return { count: 0 } }, methods: { increment() { this.count++; }, decrement() { this.count--; } } }; 6/26

Slide 10

Slide 10 text

Example Vue component
+ - {{ count }}
export default { data() { return { count: 0 } }, methods: { increment() { this.count++; }, decrement() { this.count--; } } }; 6/26

Slide 11

Slide 11 text

Example React component class Counter extends React.Component { constructor(props) { super(props); this.state = { count: 0, }; } increment() { this.setState({ count: this.state.count + 1 }); } decrement() { this.setState({ count: this.state.count - 1 }); } render() { return (
this.increment()}>+ this.decrement()}>- {this.state.count}
); } } 7/26

Slide 12

Slide 12 text

Example React component class Counter extends React.Component { constructor(props) { super(props); this.state = { count: 0, }; } increment() { this.setState({ count: this.state.count + 1 }); } decrement() { this.setState({ count: this.state.count - 1 }); } render() { return (
this.increment()}>+ this.decrement()}>- {this.state.count}
); } } 7/26

Slide 13

Slide 13 text

Example React component class Counter extends React.Component { constructor(props) { super(props); this.state = { count: 0, }; } increment() { this.setState({ count: this.state.count + 1 }); } decrement() { this.setState({ count: this.state.count - 1 }); } render() { return (
this.increment()}>+ this.decrement()}>- {this.state.count}
); } } 7/26

Slide 14

Slide 14 text

Example React component class Counter extends React.Component { constructor(props) { super(props); this.state = { count: 0, }; } increment() { this.setState({ count: this.state.count + 1 }); } decrement() { this.setState({ count: this.state.count - 1 }); } render() { return (
this.increment()}>+ this.decrement()}>- {this.state.count}
); } } 7/26

Slide 15

Slide 15 text

Example React component class Counter extends React.Component { constructor(props) { super(props); this.state = { count: 0, }; } increment() { this.setState({ count: this.state.count + 1 }); } decrement() { this.setState({ count: this.state.count - 1 }); } render() { return (
this.increment()}>+ this.decrement()}>- {this.state.count}
); } } 7/26

Slide 16

Slide 16 text

How would one accomplish the same thing using Livewire? 8/26

Slide 17

Slide 17 text

Install via composer $ composer require calebporzio/livewire Using version ^0.2.7 for calebporzio/livewire ./composer.json has been updated Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 1 install, 0 updates, 0 removals - Installing calebporzio/livewire (v0.2.7): Downloading (100%) Writing lock file Generating optimized autoload files > Illuminate\Foundation\ComposerScripts::postAutoloadDump > @php artisan package:discover --ansi Discovered Package: beyondcode/laravel-dump-server Discovered Package: calebporzio/livewire Discovered Package: fideloper/proxy Discovered Package: laravel/tinker Discovered Package: nesbot/carbon Discovered Package: nunomaduro/collision Package manifest generated successfully. 9/26

Slide 18

Slide 18 text

Include Blade directive Livewire Demo @livewireAssets 10/26

Slide 19

Slide 19 text

Include Blade directive Livewire Demo @livewireAssets 10/26

Slide 20

Slide 20 text

Create a component $ php artisan make:livewire counter ! Files created: -> [.../app/Http/Livewire/Counter.php] -> [.../resources/views/livewire/counter.blade.php] 11/26

Slide 21

Slide 21 text

The Livewire component namespace App\Http\Livewire; use Livewire\Component; class Counter extends Component { public function render() { return view('livewire.counter'); } } 12/26

Slide 22

Slide 22 text

The Livewire view
{{-- The whole world belongs to you --}}
13/26

Slide 23

Slide 23 text

Let's add some functionality
+ - {{ $count }}
14/26

Slide 24

Slide 24 text

Let's add some functionality
+ - {{ $count }}
14/26

Slide 25

Slide 25 text

Let's add some functionality
+ - {{ $count }}
14/26

Slide 26

Slide 26 text

Let's add some functionality
+ - {{ $count }}
14/26

Slide 27

Slide 27 text

Let's add some functionality class Counter extends Component { public $count = 0; public function increment() { $this->count++; } public function decrement() { $this->count--; } public function render() { return view('livewire.counter'); } } 15/26

Slide 28

Slide 28 text

Let's add some functionality class Counter extends Component { public $count = 0; public function increment() { $this->count++; } public function decrement() { $this->count--; } public function render() { return view('livewire.counter'); } } 15/26

Slide 29

Slide 29 text

Let's add some functionality class Counter extends Component { public $count = 0; public function increment() { $this->count++; } public function decrement() { $this->count--; } public function render() { return view('livewire.counter'); } } 15/26

Slide 30

Slide 30 text

Let's add some functionality class Counter extends Component { public $count = 0; public function increment() { $this->count++; } public function decrement() { $this->count--; } public function render() { return view('livewire.counter'); } } 15/26

Slide 31

Slide 31 text

Let's add some functionality class Counter extends Component { public $count = 0; public function increment() { $this->count++; } public function decrement() { $this->count--; } public function render() { return view('livewire.counter'); } } 15/26

Slide 32

Slide 32 text

Include the component Livewire Demo
@livewire('counter')
@livewireAssets 16/26

Slide 33

Slide 33 text

Include the component Livewire Demo
@livewire('counter')
@livewireAssets 16/26

Slide 34

Slide 34 text

! Demo Time! 17/26

Slide 35

Slide 35 text

Awesome! But how does it work? 18/26

Slide 36

Slide 36 text

1. Livewire hears the click because of wire:click="increment" 2. Livewire sends an ajax request to PHP 3. PHP calls the corresponding method, which updates $count 4. PHP re-renders the Blade template and sends back the HTML 5. Livewire receives the response, and updates the DOM 19/26

Slide 37

Slide 37 text

! Demo Time! 20/26

Slide 38

Slide 38 text

Wait! There's more! https://livewire-framework.com/docs/ Lifecycle Hooks Defer loading Prefetching Events Testing 21/26

Slide 39

Slide 39 text

Should you replace all your Vue components with Livewire components now? Not exactly. [...] it's better to use JavaScript for things that need to be instant (like animations) [...] A good rule of thumb is: any JavaScript components that rely on ajax for server communication, will be better off as Livewire components. — Caleb Porzio 22/26

Slide 40

Slide 40 text

Can you use it in your projects? Right now, the project is still in pre-release. Sign up for my email newsletter to get notified when It's ready for prime-time. — Caleb Porzio 23/26

Slide 41

Slide 41 text

Livewire Fiddle I'm really taking my time with this to make sure it's beautiful, functional, secure, and user friendly. Honestly, it has some features I wish CodePen had. — Caleb Porzio 24/26

Slide 42

Slide 42 text

Q&A with Caleb 25/26

Slide 43

Slide 43 text

!" Slides can be found at speakerdeck.com/mazedlx 26/26