Include Vue
Phoenix includes vue.js
2.0 and some official vue plugins to help you build a modern single page application.
\Phoenix\Script\VueScript::core();
Now you can easily use vue in your HTML page:
<!-- In <form id="admin-form"> -->
<input name="foo" type="text" v-model="foo">
<script>
new Vue({
el: '#admin-form',
data: {
foo: 'bar'
}
});
</script>
Or integrate with jQuery:
@php(Phoenix\Script\JQueryScript::core())
@php(Phoenix\Script\VueScript::core())
<script>
// Run after dom ready
jQuery(function ($) {
new Vue({
el: '#admin-form',
data: {
foo: 'bar'
}
});
})
</script>
<input name="foo" type="text" v-model="foo">
Create a Vue Instance in PHP
VueScript::instance(
'#app',
['item' => null],
[
'methods' => [
'addItem' => "\\function () { ... }"
]
]
);
This will generate JS code looks like:
<script>
window.vueInstances.app = new Vue({el:"#app",data:{item:null},methods:{addItem:function () { ... }}});
</script>
Add PHP Variable to Vue Instance
See Phoenix Core: Variable Storage
You can use php code:
PhoenixScript::store('item', $data);
To inject data to Vue:
new Vue({
el: '#app',
data: {
item: Phoenix.Store.item
}
});
Vue Animate
Use vue2-animate
package to add transition effects by animate.css.
// Include JS file
VueScript::animate();
Now you can add transition name to your template:
<transition-group name="fadeLeft" tag="ul">
<li v-for="item in items" v-bind:key="item">
{{ item }}
</li>
</transition-group>
See vue2-animate and Vue.js Transitions
Integrate with Form Builder
Use attr()
, controlAttr()
and labelAttr()
to directly add directives to input HTML.
This is an example to show how to bind alias
input with title
input.
// In Form Definition class
VueScript::animate();
VueScript::instance('#admin-form', ['title' => null, 'alias' => null], ['watch' => [
'title' => "\\function () {
this.alias = this.title.toLowerCase().replace(/[\\s+]/g, '-');
}"
]]);
// Title
$this->text('title')
->label(Translator::translate('flower.sakura.field.title'))
->attr('v-model', 'title');
// Alias
$this->text('alias')
->label(Translator::translate('flower.sakura.field.alias'))
->controlAttr('v-if', 'title')
->controlAttr('transition', 'fade')
->attr(':value', 'alias');
Vue Router
Use Vue router to handle page switch without refresh browser:
@php(\Phoenix\Script\VueScript::router())
<div id="app">
<h1>Hello App!</h1>
<p>
<a v-link="{ path: '/foo' }">Go to Foo</a>
<a v-link="{ path: '/bar' }">Go to Bar</a>
</p>
<router-view></router-view>
</div>
<script>
var Foo = Vue.extend({
template: '<p>This is foo!</p>'
})
var Bar = Vue.extend({
template: '<p>This is bar!</p>'
})
var App = Vue.extend({})
var router = new VueRouter()
router.map({
'/foo': {
component: Foo
},
'/bar': {
component: Bar
}
})
router.start(App, '#app')
</script>
See Vue Router
Vue Resource
Use vue resource to fetch server data by ajax:
@php(\Phoenix\Script\VueScript::resource())
<script>
// global Vue object
Vue.http.get('/flower/sakura', [options]).then(successCallback, errorCallback);
Vue.http.post('/flower/sakura', [body], [options]).then(successCallback, errorCallback);
// in a Vue instance
new Vue({
ready() {
// GET
this.$http.get('/flower/sakura').then((response) => {
// success callback
}, (response) => {
// error callback
});
}
})
</script>
Add custom options and global headers:
\Phoenix\Script\VueScript::resource(['root' => $uri->path], [
'common' => ['X-Foo' => 'Bar'],
'post' => ['X-Baz' => 'Yoo'],
]);
See Vue Resource
VueStrap
Use VueStrap to integrate Bootstrap:
\Phoenix\Script\VueScript::strap();
See VueStrap
Vuex
Vuex is an application architecture for centralized state management in Vue.js applications.
\Phoenix\Script\VueScript::vuex();
// Add initial state
\Phoenix\Script\VueScript::vuex([
'state' => ['count' => 0],
'mutations' => [
'INCREMENT' => '\\function (state) { state.count++ }'
]
]);
In HTML
export default new Vuex.Store({
state,
mutations
});
See Vuex
If you found a typo or error, please help us improve this document.