초기 vue.js/vue-router 로드 시 모든 서버 측 데이터를 로드하는 방법
저는 현재 WordPress REST API와 vue-router를 사용하여 작은 한 페이지 사이트의 페이지를 전환하고 있습니다.단, REST API를 사용하여 서버에 AJAX 콜을 발신하면 데이터가 로드되지만 페이지가 이미 렌더링된 후에만 데이터가 로드됩니다.
vue-router 문서는 각 경로로 이동하기 전후의 데이터 로드 방법에 대한 통찰력을 제공하지만 초기 페이지 로드 시 모든 경로 및 페이지 데이터를 로드하는 방법을 알고 싶기 때문에 경로가 활성화될 때마다 데이터를 로드할 필요가 없습니다.
참고: 데이터를 로딩하고 있습니다.acf
액세스 할 수 있습니다..vue
파일 컴포넌트 사용this.$parent.acfs
.
main.js 라우터 코드:
const router = new VueRouter({
routes: [
{ path: '/', component: Home },
{ path: '/about', component: About },
{ path: '/tickets', component: Tickets },
{ path: '/sponsors', component: Sponsors },
],
hashbang: false
});
exports.router = router;
const app = new Vue({
router,
data: {
acfs: ''
},
created() {
$.ajax({
url: 'http://localhost/placeholder/wp-json/acf/v2/page/2',
type: 'GET',
success: function(response) {
console.log(response);
this.acfs = response.acf;
// this.backgroundImage = response.acf.background_image.url
}.bind(this)
})
}
}).$mount('#app')
Home.vue 컴포넌트 코드:
export default {
name: 'about',
data () {
return {
acf: this.$parent.acfs,
}
},
}
좋은 생각 있어요?
저의 접근 방식은 AJAX 콜이 돌아올 때까지 스토어와 메인 Vue의 건설을 지연시키는 것입니다.
store.displaces를 설정합니다.
import Vue from 'vue';
import Vuex from 'vuex';
import actions from './actions';
import getters from './getters';
import mutations from './mutations';
Vue.use(Vuex);
function builder(data) {
return new Vuex.Store({
state: {
exams: data,
},
actions,
getters,
mutations,
});
}
export default builder;
main.discloss.main.discloss.
import Vue from 'vue';
import VueResource from 'vue-resource';
import App from './App';
import router from './router';
import store from './store';
Vue.config.productionTip = false;
Vue.use(VueResource);
Vue.http.options.root = 'https://miguelmartinez.com/api/';
Vue.http.get('data')
.then(response => response.json())
.then((data) => {
/* eslint-disable no-new */
new Vue({
el: '#app',
router,
store: store(data),
template: '<App/>',
components: { App },
});
});
저는 이 접근방식을 Angular 및 ExtJs와 같은 다른 프레임워크와 함께 사용해 왔습니다.
네비게이션 가드를 사용할 수 있습니다.
특정 컴포넌트에서는 다음과 같습니다.
export default {
beforeRouteEnter (to, from, next) {
// my ajax call
}
};
모든 컴포넌트에 네비게이션가드를 추가할 수도 있습니다.
router.beforeEach((to, from, next) => {
// my ajax call
});
주의할 점은 내비게이션가드는 비동기이기 때문에next()
데이터 로딩이 완료되면 콜백합니다.내 앱의 실제 예(가드 기능이 별도의 파일에 있음):
export default function(to, from, next) {
Promise.all([
IngredientTypes.init(),
Units.init(),
MashTypes.init()
]).then(() => {
next();
});
};
당신 같은 경우에는 전화해야 할 필요가 있습니다.next()
에서success
물론 콜백이죠.
저는 이 게시물에 대한 모든 좋은 반응을 바탕으로 저만의 버전을 구성했습니다.몇 년이 지났고 더 많은 도구를 내게 주기도 했다.
main.js에서는 비동기/대기 기능을 사용하여 프리페치서비스를 호출하여 기동 시에 필요한 데이터를 로드합니다.가독성이 높아집니다.데이터 통신을 받은 후 beforeCreate() 후크에 있는 적절한 vuex 스토어 모듈에 디스패치합니다.
import Vue from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';
import { prefetchAppData } from '@/services/prefetch.service';
(async () => {
let comms = await prefetchAppData();
new Vue({
router,
store,
beforeCreate() {
store.dispatch('communityModule/initialize', comms);
},
mounted() {},
render: h => h(App)
}).$mount('#app');
})();
당신이 선호하는 것을 조심하라고 그들에게 경고해야 할 것 같아요.초기 앱 로딩이 지연되므로 이 작업은 신중하게 수행하도록 하십시오. 이는 사용자 환경에 적합하지 않습니다.
여기 데이터를 로드하는 샘플 prefetch.service.js가 있습니다.물론 이건 좀 더 정교할 수 있어요.
import api from '@api/community.api';
export async function prefetchAppData() {
return await api.getCommunities();
}
심플한 vue 스토어.이 스토어는 응용 프로그램을 시작하기 전에 로드해야 하는 '커뮤니티' 목록을 유지합니다.
community.store.module (vuex 모듈을 사용하는 것에 주의해 주세요.
export const communityModule = {
namespaced: true,
state: {
communities: []
},
getters: {
communities(state) {
return state.communities;
},
},
mutations: {
SET_COMMUNITIES(state, communities) {
state.communities = communities;
}
},
actions: {
// instead of loading data here, it is passed in
initialize({ commit }, comms) {
commit('SET_COMMUNITIES', comms);
}
}
};
내가은, 「」내의 입니다.main.js
및 과 같이 할당합니다.
main.discloss.main.discloss.
let acfData;
$.ajax({
async: false,
url: 'http://localhost/placeholder/wp-json/acf/v2/page/2',
type: 'GET',
success: function(response) {
console.log(response.acf);
acfData = response.acf;
}.bind(this)
})
const router = new VueRouter({
routes: [
{ path: '/', component: Home },
{ path: '/about', component: About },
{ path: '/tickets', component: Tickets },
{ path: '/sponsors', component: Sponsors },
],
hashbang: false
});
exports.router = router;
const app = new Vue({
router,
data: {
acfs: acfData
},
created() {
}
}).$mount('#app')
할 수 ..vue
다음과 같이 합니다.
export default {
name: 'app',
data () {
return {
acf: this.$parent.acfs,
}
},
마지막으로 동일한 데이터 내에서 렌더링합니다..vue
츠키다
<template>
<transition
name="home"
v-on:enter="enter"
v-on:leave="leave"
v-bind:css="false"
mode="out-in"
>
<div class="full-height-container background-image home" v-bind:style="{backgroundImage: 'url(' + this.acf.home_background_image.url + ')'}">
<div class="content-container">
<h1 class="white bold home-title">{{ acf.home_title }}</h1>
<h2 class="white home-subtitle">{{ acf.home_subtitle }}</h2>
<div class="button-block">
<a href="#/about"><button class="white home-button-1">{{ acf.link_title_1 }}</button></a>
<a href="#/tickets"><button class="white home-button-2">{{ acf.link_title_2 }}</button></a>
</div>
</div>
</div>
</transition>
</template>
할 은, 가 ACF 를 할 마다, ACF 데이터는 「ONCE」라고 하는 것입니다.beforeRouteEnter (to, from, next)
그 결과, 원하는 대로 매끄러운 페이지 전환을 할 수 있습니다.
이것이 누구든 같은 문제를 마주치는 사람에게 도움이 되기를 바란다.
Vue Router 문서에서 이 섹션을 확인하십시오.
https://router.vuejs.org/guide/advanced/data-fetching.html
따라서 먼저 엔드포인트에서 데이터를 가져오는 방법을 쓴 다음 워처를 사용하여 경로를 감시해야 합니다.
export default {
watch: {
'$route': 'fetchItems'
},
methods: {
fetchItems() {
// fetch logic
}
}
}
WP Rest API로 작업하고 있으니 Github https://github.com/bedakb/vuewp/blob/master/public/app/themes/vuewp/app/views/PostView.vue#L39에서 제 레포 확인 부탁드립니다.
언급URL : https://stackoverflow.com/questions/41572974/how-to-load-all-server-side-data-on-initial-vue-js-vue-router-load
'programing' 카테고리의 다른 글
AngularJS 조건부 ng-disabled가 다시 활성화되지 않음 (0) | 2023.03.21 |
---|---|
로컬 데이터베이스의 스트라이프 미러링(구독, 청구서, 쿠폰 등)은 효율적입니까? (0) | 2023.03.21 |
스프링 부트 복수 데이터 소스 (0) | 2023.03.21 |
npm 링크에 연결된 패키지가 업데이트되지 않습니다. (0) | 2023.03.16 |
Woocommerce 제품갤러리 이미지 URL을 입수하는 방법 (0) | 2023.03.16 |