Ajax를 통해 템플릿을 가져오는 Vue.js 믹스인
< html >
< body >
< div id =" app " > </ div >
< script src =" /app.js " > </ script >
</ body >
</ html > // app.js
import Vue from "vue/dist/vue.esm"
import VueRemoteTemplate from "vue-remote-template"
document . addEventListener ( "DOMContentLoaded" , ( ) => {
new Vue ( {
mixins : [ VueRemoteTemplate ] ,
el : "#app" ,
data : {
templatePath : "/hello"
}
} )
} ) 위 코드는 Ajax를 통해 /hello 에서 HTML 조각을 가져옵니다. 우리는 이것을 원격 템플릿 이라고 부릅니다. 원격 템플릿은 Vue 템플릿으로 컴파일되며 대상 <div> 요소에 DOM 트리를 구성하는 데 사용됩니다.
원격 템플릿을 가져오면 Vue 구성 요소가 동적으로 생성됩니다.
그리고 원격 템플릿에 v-model 지시어가 포함되어 있으면 vue-data-scooper 패키지의 getInitialData 함수를 사용하여 구성 요소의 데이터가 초기화됩니다.
< form >
< input type =" text " name =" user[name] " v-model =" user.name " value =" Alice " >
</ form > 위의 원격 템플릿은 구성 요소의 user.name 속성을 문자열 "Alice"로 설정합니다.
백엔드 서버의 응답 날짜는 문자열 또는 JSON 데이터일 수 있습니다.
전자의 경우 문자열은 원격 템플릿으로 해석됩니다.
후자의 경우 JSON 데이터에는 template 키와 선택적 data 키가 있어야 합니다. template 키 값은 원격 템플릿으로 해석됩니다. data 키의 값은 Vue 구성 요소의 초기 데이터로 사용됩니다.
예를 들어 서버가 다음 JSON 데이터를 반환하는 경우:
{
"template" : " <div>{{ message }}</div> " ,
"data" : { "message" : " Hello, world! " }
} 그러면 결과 HTML 조각은 <div>Hello, world!</div> 가 됩니다.
서버의 JSON 데이터에서 제공한 초기 데이터는 v-model 지시문에 의해 설정된 데이터를 덮어씁니다.
v-model 지시어를 통해 입력에 바인딩되지 않은 구성 요소의 속성을 초기화하려면 확장을 제공해야 합니다.
// greeting.js
export const greeting = {
data : function ( ) {
return {
name : "Alice"
}
}
}확장은 구성 요소를 만들 때 사용되는 믹스인 입니다.
extensions 속성에 확장을 등록할 수 있습니다.
// app.js
import Vue from "vue/dist/vue.esm"
import VueRemoteTemplate from "vue-remote-template"
import { greeting } from "./greeting"
document . addEventListener ( "DOMContentLoaded" , ( ) => {
new Vue ( {
mixins : [ VueRemoteTemplate ] ,
el : "#app" ,
data : {
templatePath : "/hello" ,
extensions : {
greeting : greeting
}
}
} )
} ) 확장 이름은 원격 템플릿 루트 요소의 data-extension 속성으로 지정되어야 합니다.
< div data-extension =" greeting " >
< div > Hello, {{name}}! </ div >
</ div >위 템플릿은 다음 HTML 조각을 생성합니다.
< div data-extension =" greeting " >
< div > Hello, Alice! </ div >
</ div > visit 방법 visit 메소드를 호출하여 원격 템플릿을 전환할 수 있습니다.
< div >
< button type =" button " @click =" visit('/goodbye') " > Click me! </ button >
</ div > 사용자가 브라우저에서 이 버튼을 클릭하면 /goodbye 에 대한 Ajax 액세스가 실행되고 원격 템플릿을 가져옵니다.
새로 가져온 템플릿의 루트 요소에 data-title 속성이 있는 경우 해당 값은 문서 제목으로 설정됩니다.
그리고 새로 가져온 템플릿의 루트 요소에는 data-url 속성이 있으며, 해당 값은 window.history.pushState() 메서드를 사용하여 브라우저 기록에 항목을 추가하는 데 사용됩니다.
다음은 원격 템플릿의 예입니다.
< div data-extension =" greeting " data-title =" Farewell " data-url =" /bye " >
< div > Goodbye, {{name}}! </ div >
</ div > a 에 visit 메소드를 사용하는 경우 메소드에 대한 인수를 생략할 수 있습니다. a 요소의 href 값은 원격 템플릿 경로로 해석됩니다.
< div >
< a href =" /goodbye " @click.prevent =" visit " > Click me! </ a >
</ div >브라우저가 실제로 지정된 경로를 방문하지 않도록 기본 동작을 방지 해야 한다는 점에 유의하세요.
submit 방법 submit 메소드를 호출하여 Ajax 호출을 통해 양식 데이터를 제출할 수 있습니다.
< form action =" /users/123 " method =" post " @submit.prevent =" submit " >
< input type =" hidden " name =" _method " value =" patch " >
< input type =" text " name =" user[name] " v-model =" user.name " value =" Alice " >
< input type =" submit " value =" Update " >
</ form > 사용자가 "업데이트" 버튼을 클릭하면 PATCH 메소드를 통한 Ajax 요청이 /users/123 에 제출됩니다.
서버가 텍스트를 반환하면 결과를 표시하기 위한 원격 템플릿으로 사용됩니다. 서버가 JSON 객체를 반환하는 경우 원격 템플릿을 가져오기 위해 다른 Ajax 요청을 만드는 데 사용되는 값인 templatePath 키를 포함해야 합니다.
submit 메소드는 <form> 요소에서 호출되어야 합니다. 양식 내의 요소에서는 호출할 수 없습니다.
또한 Ajax 호출 방법은 이름이 _method 인 숨겨진 요소의 값에 따라 결정됩니다.
https://github.com/kuroda/vue-rails-form-builder-demo를 참조하세요.
# install dependencies
yarn install
# test
yarn test 테스트를 실행하려면 Google Chrome 버전 59 이상이 필요합니다. google-chrome-beta 사용하는 경우 CHROME_BIN 환경 변수를 내보냅니다.
export CHROME_BIN= $( which google-chrome-beta ) yarn build