Миксин Vue.js для получения шаблона через Ajax
< 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"
}
} )
} ) Приведенный выше код извлекает фрагмент HTML из /hello через Ajax. Мы называем этот удаленный шаблон . Удаленные шаблоны компилируются в шаблоны Vue и используются для построения дерева DOM в целевом элементе <div> .
Когда извлекается удаленный шаблон, компонент Vue создается динамически.
А если удаленные шаблоны содержат директивы v-model , данные компонента инициализируются с помощью функции getInitialData пакета vue-data-scooper.
< form >
< input type =" text " name =" user[name] " v-model =" user.name " value =" Alice " >
</ form > Приведенный выше удаленный шаблон устанавливает для свойства user.name компонента строку «Алиса».
Дата ответа от внутреннего сервера может быть строкой или данными 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 > Когда пользователь нажимает эту кнопку в браузере, выполняется Ajax-доступ к /goodbye и извлекается удаленный шаблон.
Если корневой элемент вновь полученного шаблона имеет атрибут data-title , его значением устанавливается заголовок документа.
Корневой элемент вновь полученного шаблона имеет атрибут data-url , его значение используется для добавления записи в историю браузера с помощью метода window.history.pushState().
Вот пример удаленного шаблона:
< div data-extension =" greeting " data-title =" Farewell " data-url =" /bye " >
< div > Goodbye, {{name}}! </ div >
</ div > Если вы используете метод visit для элемента a , вы можете опустить аргумент этого метода. Значение href элемента a интерпретируется как путь к удаленному шаблону.
< 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 > Когда пользователь нажимает кнопку «Обновить», запрос Ajax через метод PATCH отправляется в /users/123 .
Если сервер возвращает текст, он используется как удаленный шаблон для отображения результата. Если сервер возвращает объект JSON, он должен содержать ключ templatePath , значение которого используется для выполнения другого запроса Ajax для получения удаленного шаблона.
Обратите внимание, что метод 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