>  기사  >  웹 프론트엔드  >  Vue 애플리케이션에서 AJAX를 구현하는 4가지 장소

Vue 애플리케이션에서 AJAX를 구현하는 4가지 장소

PHPz
PHPz앞으로
2020-09-25 16:07:032404검색

Vue 애플리케이션에서 AJAX를 구현하는 4가지 장소

Vue는 AJAX를 구현하는 공식적인 방법을 제공하지 않으며 효과적으로 사용할 수 있는 다양한 디자인 패턴이 있습니다. 각 방법에는 장단점이 있으므로 필요에 따라 판단해야 합니다. 동시에 여러 개를 사용할 수도 있습니다!

이 기사에서는 Vue 애플리케이션에서 AJAX를 구현하는 네 가지 위치를 보여 드리겠습니다.

  • Root Instance

  • Component

  • Vuex Action

  • 경로 탐색 가드

각 방법을 설명하고 예를 들어 장단점을 논의하겠습니다.

1. 루트 인스턴스

이 아키텍처를 사용하면 루트 인스턴스에서 모든 AJAX 요청을 수행하고 모든 상태를 루트 인스턴스에 저장할 수 있습니다. 하위 구성 요소에 데이터가 필요한 경우 도우미 역할을 합니다. 하위 구성 요소가 데이터를 새로 고쳐야 하는 경우 루트 인스턴스에 사용자 지정 이벤트를 사용하여 이를 요청하라는 메시지가 표시됩니다.

예:

new Vue({
  data: {
    message: ''
  },
  methods: {
    refreshMessage(resource) {
      this.$http.get('/message').then((response) {
        this.message = response.data.message;
      });
    }
  }
})

Vue.component('sub-component', {
  template: &#39;<div>{{ message }}</div>&#39;,
  props: [ &#39;message&#39; ]
  methods: {
    refreshMessage() {
      this.$emit(&#39;refreshMessage&#39;);
    }
  }
});

장점:

  • 모든 AJAX 로직과 데이터를 한 곳에 보관하세요.

  • 구성 요소를 "멍청하게" 유지하여 프레젠테이션에 집중할 수 있도록 하세요.

단점:

  • 애플리케이션이 확장됨에 따라 많은 소품과 맞춤 이벤트가 필요합니다.

2. 구성 요소

이 아키텍처를 사용하면 구성 요소가 자체 AJAX 요청 및 상태를 독립적으로 관리할 책임이 있습니다. 실제로는 자체 로컬 "프레젠테이션" 구성 요소 그룹에 대한 데이터를 관리하는 여러 "컨테이너" 구성 요소를 만들고 싶을 수도 있습니다.

예를 들어, filter-list는 프레젠테이션 구성 요소 역할을 하는 filter-input 및 filter-reset을 래핑하는 컨테이너 구성 요소일 수 있습니다. 필터 목록에는 AJAX 로직이 포함되며 소품과 이벤트를 통해 통신하면서 그룹의 모든 구성 요소에 대한 데이터를 관리합니다.

이 아키텍처를 더 쉽게 구현하려면 AJAX 로직을 믹스인으로 추상화한 다음 구성 요소의 믹스인을 사용하여 AJAX를 활성화할 수 있습니다.

let mixin = {
  methods: {
    callAJAX(resource) {
      ...
    }
  }
}

Vue.component(&#39;container-comp&#39;, {
  // No meaningful template, I just manage data for my children
  template: &#39;<div><presentation-comp :mydata="mydata"></presentation-comp></div>&#39;, 
  mixins: [ myMixin ],
  data() {
    return { ... }
  },

})

Vue.component(&#39;presentation-comp&#39;, {
  template: <div>I just show stuff like {{ mydata }}</div>,
  props: [ &#39;mydata&#39; ]
})

장점:

  • 구성 요소를 분리하고 재사용할 수 있도록 유지하세요.

  • 언제 어디서나 필요한 데이터를 얻으세요.

단점:

  • 다른 구성 요소 또는 구성 요소 그룹과 데이터를 전달하는 것이 쉽지 않습니다.

  • 구성 요소에는 책임이 너무 많고 기능이 중복될 수 있습니다.

3. Vuex 실행

이 아키텍처를 사용하면 Vuex 저장소에서 상태 저장 논리와 AJAX 논리를 관리할 수 있습니다. 구성 요소는 디스패치 작업을 통해 새 데이터를 요청할 수 있습니다.

이 패턴을 구현하는 경우 로딩 스피너 숨기기, 버튼 등..

store = new Vuex.Store({
  state: {
    message: &#39;&#39;
  },
  mutations: {
    updateMessage(state, payload) {
      state.message = payload
    }
  },
  actions: {
    refreshMessage(context) {
      return new Promise((resolve) => {
        this.$http.get(&#39;...&#39;).then((response) => {
          context.commit(&#39;updateMessage&#39;, response.data.message);
          resolve();
        });
      });
    }
  }
});

Vue.component(&#39;my-component&#39;, {
  template: &#39;<div>{{ message }}</div>&#39;,
  methods: {
    refreshMessage() {
      this.$store.dispatch(&#39;refeshMessage&#39;).then(() => {
        // do stuff
      });
    }
  },
  computed: {
    message: { return this.$store.state.message; }
  }
});

저는 이 아키텍처를 좋아합니다. 왜냐하면 상태와 표현 로직을 매우 잘 분리하기 때문입니다. Vuex를 사용하는 경우 다음 방법 중 하나를 사용하세요. Vuex를 사용하지 않는다면 아마도 이것이 충분한 이유일 것입니다.

장점:

  • 소품 및 사용자 정의 이벤트가 필요 없이 루트 구성 요소 아키텍처의 모든 장점을 누릴 수 있습니다.

단점:

  • Vuex 오버헤드 증가

4. 경로 탐색 가드

이 아키텍처를 사용하면 애플리케이션이 여러 페이지로 분할됩니다. 경로가 변경되면, 페이지와 해당 하위 구성 요소에 필요한 모든 데이터를 가져옵니다.

이 접근 방식의 가장 큰 장점은 UI가 정말 단순화된다는 것입니다. 구성 요소가 자체 데이터를 독립적으로 얻는 경우 구성 요소 데이터가 임의의 순서로 채워지면 페이지가 예기치 않게 다시 렌더링됩니다.

实现此功能的一个简单方法是在服务器上为每个页面创建端点,例如/about、/contact等,这些端点与应用程序中的路由名匹配。然后,可以实现一个通用的beforeRouteEnter钩子,将所有数据属性合并到页面组件的数据中:

import axios from &#39;axios&#39;;

router.beforeRouteEnter((to, from, next) => {
  axios.get(`/api${to.path}`).then(({ data }) => {
    next(vm => Object.assign(vm.$data, data))
  });
})

优点:

  • 使UI更加可预测。

缺点:

  • 整体上比较慢,因为页面在所有数据都准备好之前无法呈现。

  • 如果您不使用路由,也没有多大帮助。

附加模式:服务器—在页面中呈现第一个AJAX调用

不建议在初始页面加载时使用AJAX检索应用程序状态,因为它需要额外的到服务器的往返,这会延迟应用程序的呈现。

相反,将初始应用程序状态注入HTML页面头部的内联脚本中,以便在需要时将其作为全局变量提供给应用程序。

<html>
...
<head>
  ...
  <script type="text/javascript">
   window.__INITIAL_STATE__ = &#39;{ "data": [ ... ] }&#39;;
  </script>
</head>
<body>
  <div id="app"></div>
</body>
</html>

然后,AJAX可以更恰当地用于后续数据获取。

相关推荐:

2020年前端vue面试题大汇总(附答案)

vue教程推荐:2020最新的5个vue.js视频教程精选

更多编程相关知识,请访问:编程入门!!

위 내용은 Vue 애플리케이션에서 AJAX를 구현하는 4가지 장소의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 vuejsdevelopers.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제