Я хочу использовать Vue.js с cdn в приложении, которое обслуживается fastApi.
Я сделал прототип без быстрого API, только cdn vue в index.html и app.js. Обе комбинации работают хорошо, подсчет увеличивается при нажатии кнопки.
Затем я перехожу к проектам fastApi и использую в сотрудничестве с его механизмом шаблонов. app.js кажется загруженным.
Но кажется, что vue не загружается, потому что переменное сообщение и счетчик не распознаются (и не отображаются на html-странице), а нажатие кнопки не добавляет значение счетчика.
Любое предложение, что не так с моим подходом? заранее спасибо.
Структура проектов.
/static
-/js
--/myapp.js
/templates
-/index.html
my_app.py
содержание index.html
<head>
<meta charset = "UTF-8">
<title>Learning Vue</title>
<script src = "https://unpkg.com/vue@3/dist/vue.global.js"></script>
</script>
</head>
<body>
<div id = "app">
{{ count }} = {{message}}
<h1>Hello, Vue :) </h1>
<button @click = "push_button"> ok </button>
</div>
<script type = "module" src = "{{ url_for('static', path='/js/app.js') }}"></script>
</body>
myapp.js
const app = Vue.createApp({
data() {
return {
count: 100, message: "Hallo"
}
},
methods: {
push_button() {
this.count++
}
}
})
;
app.mount("#app")
my_app.py
app = FastAPI()
app.mount("/static", StaticFiles(directory = "static"), name = "static")
templates = Jinja2Templates(directory = "templates")
@app.get("/", response_class=HTMLResponse)
async def get(request: Request):
return templates.TemplateResponse("index.html", {"request": request})





Это происходит потому, что разделители шаблонов, используемые Jinja2, такие же, как и Vue во внешнем интерфейсе. Вы можете изменить разделители интерполяции в своем приложении vue следующим образом:
Внутри myapp.js:
app.config.compilerOptions.delimiters = ['[[', ']]']
app.mount("#app")
И обновите index.html
<head>
<meta charset = "UTF-8">
<title>Learning Vue</title>
<script src = "https://unpkg.com/vue@3/dist/vue.global.js"></script>
</script>
</head>
<body>
<div id = "app">
[[ count ]] = [[message]]
<h1>Hello, Vue :) </h1>
<button @click = "push_button"> ok </button>
</div>
<script type = "module" src = "{{ url_for('static', path='/js/app.js') }}"></script>
</body>
Вместо изменения разделителей, как показано ниже, если URL-адрес — это единственное, что вам нужно расширить в вашем шаблоне, подумайте о том, чтобы просто жестко закодировать его (или разрешить его в своем контроллере) и использовать вместо этого
HTMLResponse. Изменение разделителей заставит весь ваш код Vue выглядеть иначе, чем у других разработчиков, и отличаться от любого другого ресурса, который вы используете с Vue.