JSFiddle - React, Tailwind, and code Playground

by rich_harris

HTML

<main></main>

<script id='template' type='text/ractive'>
    <h1>Hello {{name}}!</h1>
    <p>We're using Ractive.js version {{version}}</p>
</script>

CSS

body {
    font-family: 'Helvetica Neue', arial, sans-serif;
    font-weight: 200;
    color: #353535;
}

h1, h2, h3, h4, h5, h6 {
    font-weight: 200;
}

.error {
    color: #d00;
    font-family: monospace;
}

JavaScript

Ractive.prototype.once = function ( eventName, handler ) {
    var listener = this.on( eventName, function () {
        handler.apply( this, arguments );
        listener.cancel();
    });
    
    return listener; // so we can still do listener.cancel() manually
};

Ractive.prototype.observeOnce = function ( property, callback, options ) {
    var observer = this.observe( property, function () {
        callback.apply( this, arguments );
        observer.cancel();
    }, { init: false, defer: options && options.defer });
    
    return observer;
};

var ractive = new Ractive({
    el: 'main',
    template: '#template',
    data: {
        name: 'world', version: Ractive.VERSION
    }
});

ractive.once( 'myEvent', function ( message ) {
    console.log( 'myEvent was called with %s', message );
});

ractive.fire( 'myEvent', 'the first message' );
ractive.fire( 'myEvent', 'the second message, which should be ignored' );

ractive.observeOnce( 'name', function ( newName, oldName ) {
    console.log( 'name changed from %s to %s', oldName, newName );
});

ractive.set( 'name', 'everybody' );
ractive.set( 'name', 'mum' );