vue.js - 在 HTML 页面中插入 VueJS 组件模板不起作用
问题描述
我有以下 main.js:
import Test from './components/Test.vue'
Vue.component('test', Test);
var vm = new Vue({
el: '.vue-wrap',
components: { Test },
});
window.vm = vm;
我有以下Test.vue:
<template>
<li>
Hello World
</li>
</template>
<script>
export default {
name: 'Test',
}
</script>
我构建应用程序并将“dist”文件夹的内容复制到我网站的“vue”文件夹中。我有以下 HTML 文件:
<!DOCTYPE html><html><head><meta charset=utf-8><link rel=apple-touch-icon sizes=76x76 href=static/img/apple-icon.png><link rel=icon type=image/png sizes=96x96 href=static/img/favicon.png><meta http-equiv=X-UA-Compatible content="IE=edge,chrome=1"><title>My App!</title><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0"><link type=text/css href="https://fonts.googleapis.com/css?family=Muli:400,300" rel=stylesheet><link type=text/css href="https://fonts.googleapis.com/css?family=Montserrat" rel=stylesheet><link type=text/css href=https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css rel=stylesheet><link type=text/css href=https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css rel=stylesheet><link href=static/css/themify-icons.css rel=stylesheet><link href=/vue/static/css/app.d9b210b92ea60ad0856c8dc063cccfec.css rel=stylesheet></head><body><div class=wrapper id=app></div><script type=text/javascript src=/vue/static/js/manifest.bdf9878acc459aaa413c.js></script><script type=text/javascript src=/vue/static/js/vendor.0eae82ab4e0e2a32fd9c.js></script><script type=text/javascript src=/vue/static/js/app.aa1500d2bdd1b2f93122.js></script>
<div class="vue-wrap">
<test></test>
</div>
</body>
</html>
我的 package.json 文件:
{
"name": "vue-paper-dashboard-pro",
"version": "1.1.0",
"description": "A premium Vue.js admin dashboard for bootstrap. Coded by Cristi Jora, designed by Creative Tim.",
"author": "cristian.jora <cristian.jora@corebuild.eu>",
"private": true,
"scripts": {
"dev": "cross-env ENABLE_ESLINT=false node build/dev-server.js",
"build": "cross-env ENABLE_ESLINT=false node build/build.js",
"unit": "cross-env BABEL_ENV=test karma start test/unit/karma.conf.js --single-run",
"unit:watch": "cross-env BABEL_ENV=test karma start test/unit/karma.conf.js --watch",
"e2e": "node test/e2e/runner.js",
"test": "npm run unit && npm run e2e"
},
"dependencies": {
"axios": "^0.18.0",
"chartist": "^0.11.0",
"easy-pie-chart": "^2.1.7",
"element-ui": "^2.0.3",
"fullcalendar": "^3.6.2",
"google-maps": "^3.2.1",
"jquery": "^3.2.1",
"jvectormap-next": "^3.0.0",
"jwt-decode": "^2.2.0",
"perfect-scrollbar": "0.7.1",
"postcss-import": "^11.1.0",
"postcss-url": "^7.3.2",
"router": "^1.3.2",
"sweetalert2": "^6.11.4",
"vee-validate": "^2.0.0-rc.21",
"vue": "^2.5.2",
"vue-axios": "^2.1.1",
"vue-beautify": "^1.1.3",
"vue-clickaway": "^2.1.0",
"vue-form-wizard": "^0.7.0",
"vue-google-autocomplete": "^1.1.0",
"vue-nav-tabs": "^0.5.4",
"vue-notifyjs": "^0.2.0",
"vue-router": "^3.0.1",
"vuex": "^3.0.1"
},
"devDependencies": {
"autoprefixer": "^7.1.2",
"babel-core": "^6.22.1",
"babel-eslint": "^7.1.1",
"babel-helper-vue-jsx-merge-props": "^2.0.3",
"babel-loader": "^7.1.1",
"babel-plugin-component": "^0.9.1",
"babel-plugin-istanbul": "^4.1.5",
"babel-plugin-syntax-jsx": "^6.18.0",
"babel-plugin-transform-runtime": "^6.22.0",
"babel-plugin-transform-vue-jsx": "^3.7.0",
"babel-preset-env": "^1.7.0",
"babel-preset-stage-2": "^6.22.0",
"babel-register": "^6.22.0",
"chai": "^4.1.2",
"chalk": "^2.0.1",
"chromedriver": "^2.27.2",
"compression-webpack-plugin": "^1.0.1",
"connect-history-api-fallback": "^1.3.0",
"copy-webpack-plugin": "^4.1.0",
"cross-env": "^5.0.1",
"cross-spawn": "^5.0.1",
"css-loader": "^0.28.0",
"eslint": "^3.19.0",
"eslint-config-standard": "^10.2.1",
"eslint-friendly-formatter": "^3.0.0",
"eslint-loader": "^1.7.1",
"eslint-plugin-html": "^3.0.0",
"eslint-plugin-import": "^2.11.0",
"eslint-plugin-node": "^4.2.3",
"eslint-plugin-promise": "^3.7.0",
"eslint-plugin-standard": "^3.1.0",
"eslint-plugin-vue": "^4.5.0",
"eventsource-polyfill": "^0.9.6",
"express": "^4.14.1",
"extract-text-webpack-plugin": "^2.0.0",
"file-loader": "^0.11.1",
"friendly-errors-webpack-plugin": "^1.1.3",
"function-bind": "^1.1.0",
"html-webpack-plugin": "^2.28.0",
"http-proxy-middleware": "^0.17.3",
"inject-loader": "^3.0.0",
"karma": "^1.4.1",
"karma-coverage": "^1.1.1",
"karma-mocha": "^1.3.0",
"karma-phantomjs-launcher": "^1.0.2",
"karma-phantomjs-shim": "^1.4.0",
"karma-sinon-chai": "^1.3.1",
"karma-sourcemap-loader": "^0.3.7",
"karma-spec-reporter": "0.0.31",
"karma-webpack": "^2.0.2",
"lolex": "^1.5.2",
"marked": "^0.3.6",
"mocha": "^3.2.0",
"nightwatch": "^0.9.12",
"node-sass": "^4.5.3",
"opn": "^5.1.0",
"optimize-css-assets-webpack-plugin": "^3.2.0",
"ora": "^1.2.0",
"phantomjs-prebuilt": "^2.1.14",
"raw-loader": "^0.5.1",
"sass-loader": "^5.0.1",
"selenium-server": "^3.0.1",
"semver": "^5.3.0",
"shelljs": "^0.7.6",
"sinon": "^2.1.0",
"sinon-chai": "^2.8.0",
"url-loader": "^0.5.8",
"vue-loader": "^13.0.4",
"vue-style-loader": "^3.0.1",
"vue-template-compiler": "^2.5.2",
"vue-test-utils": "^1.0.0-beta.3",
"webpack": "^2.7.0",
"webpack-bundle-analyzer": "^2.2.1",
"webpack-dev-middleware": "^1.10.0",
"webpack-hot-middleware": "^2.18.0",
"webpack-merge": "^4.1.0"
},
"engines": {
"node": ">= 4.0.0",
"npm": ">= 3.0.0"
}
}
VueJs 不应该直接用 HTML 填充“测试”标签吗?因为在我的情况下,所有 css/js 文件都加载正常,如果我在控制台中输入“vm”,我可以看到 Vue 对象,但模板部分仍然没有插入 HTML。我怎样才能做到这一点?我的页面是空的。我想加载多个组件,如果在 HTML 中找到这些组件,它们应该插入到组件槽中。
解决方案
如果您希望能够通过将其包装在“main”中来指定 Vue 正在使用的组件,则<div class="vue-wrap">
可以使用slots。
var vm = new Vue({
el: '.vue-wrap',
template: "<slot></slot>",
components: {
/* all components injected by "slots" */
Test,
SomeComponent
},
});
<test></test>
...然后您可以通过将其添加为主 div 的子项来注入您的组件。
<div class="vue-wrap">
<test></test>
<some-component></some-component>
</div>
否则,如果您能够在 Vue 组件中编写模板,则应使用template
@latovic 建议的键/选项。
var vm = new Vue({
el: '.vue-wrap',
template: `
<test></test>
<some-component></some-component>
`,
components: { Test, SomeComponent }
});
如果您正在构建应用程序,换句话说,如果您可以使用.vue
文件,那么您可以在单文件组件中编写模板。
更新(由于问题更新)
在您的特定示例中,尝试删除Vue.component('test', Tree);
asi 可能会由于不区分大小写的名称而导致一些问题(这样您正在创建全局组件test
并且您已经导入并注册了组件Test
)。
此外,如前所述,如果你想传递<test></test>
给你的 HTML 而不是模板,你需要一个<slot></slot>
.
import Test from "/path/to/component";
var vm = new Vue({
el: '.vue-wrap',
template: "<slot></slot>",
components: {
/* all components injected by "slots" */
Test
},
});
但是,如果您的 index.html 完全为空,则说明您的构建过程存在问题,我们无法提供帮助,因为我们没有相关信息。
推荐阅读
- firebase - 如何在 React Native(iOS)中处理 FCM 仅数据消息
- python - 是否有 Microsoft SQL Server 地理/几何类型的示例 SQLAlchemy UserDefinedType?
- mysql - 如何修复日期函数的 SQL 查询?
- c# - 如何使用存储过程从 SQL Server 2012 检索 Blob (VarBinary) 数据作为字符串?
- python - django bootstrap 4 导航栏切换按钮在本地主机上不起作用
- python - 我该怎么做呢?通过用户输入向字典添加值?
- docker - docker-compose 仅在 Jenkins 容器内构建映像失败
- git - 为什么 git 将 .gitignored 文件夹标记为未跟踪?
- python - 尝试在 pyqt5 gui 应用程序中使用 4x4 键盘
- xamarin - 升级后 MvxListView 中的 ListItems 与 MvvmCross 6.4.1 中的 Items 绑定不一致