https://vuejs.org/v2/guide/components.html
components 間怎麼溝通呢? 通常以parent-child 的闗係來傳值
props down, events up.
var app = new Vue({
el: '#app',
data: {
currentView: 'initView',
item: {}
},
methods: {
updateItem: function(obj) {
this.item = obj;
console.log(this.item);
}
}
})
parent裡有一個item的obj 利用props 傳到child component
Vue.component('initView', {
props: ['item'],
template: '#initView',
data: function() {
return {
url: /*[[${url}]]*/
}
},
methods: {
getData: function() {
console.log(this.url);
let vm = this;
this.$http.get(this.url).then((response) => {
// success callback
console.log(response.data.obj);
let obj = response.data.obj;
vm.$emit('get-data', obj);
}, (response) => {
// error callback
});
}
}
});
child component 在跟api 取得值後利用emit 傳回parent 更新item
由getData 傳到parent的updateItem
<component :is="currentView" :item="item" v-on:get-data="updateItem"> </component>
getData 在HTML裡必須寫成get-data 詳見以下
https://vuejs.org/v2/guide/components.html
HTML attributes are case-insensitive, so when using non-string templates, camelCased prop names need to use their kebab-case (hyphen-delimited) equivalents:
或是改用 string templates
<body>
<div class="container" id="app">
<component :is="currentView" :item="item" v-on:get-data="updateItem">
</component>
</div>
<template id="initView">
<div>
<p>
{{item}}
</p>
<div class="btn-group">
<button type="button" class="btn btn-success" @click="getData">讀取API</button>
</div>
</div>
</template>
<script th:inline="javascript">
Vue.prototype.$http = axios;
Vue.component('initView', {
props: ['item'],
template: '#initView',
data: function() {
return {
url: /*[[${url}]]*/
}
},
methods: {
getData: function() {
console.log(this.url);
let vm=this;
this.$http.get(this.url).then((response) => {
// success callback
console.log(response.data.obj);
let obj = response.data.obj;
vm.$emit('get-data', obj);
// this.showModal = true;
}, (response) => {
// error callback
});
}
}
});
var app = new Vue({
el: '#app',
data: {
currentView: 'initView',
item: {}
},
methods: {
updateItem: function(obj) {
this.item = obj;
console.log(this.item);
}
}
})
</script>
</body>
