【发布时间】:2021-02-06 23:01:40
【问题描述】:
tl;dr 在基础 js 文件中导入 Vue3 的正确方法是什么,然后在将在该基础文件之后加载的其他独立 js 文件中使用 Vue 的 composition-api?
我正在使用 Vue 来增强特定页面的用户体验。例如,在注册页面以执行 ajax 请求并显示服务器错误而无需重新加载页面。简而言之,MPA 中的迷你 SPA...
在 Vue2 中,在基础文件中导入 Vue,然后实例化一个新的 Vue 实例并在后续文件中使用 Vue 的 options-api 没有问题。并且后续文件的大小保持最小,因为它们只包含该文件所需的逻辑。
但是,由于 Vue3 的 composition-api 需要导入 ref, reactive, watch, onMount...etc,导致后面的文件重新导入 Vue。我试图克服这个问题如下:
// register.blade.php (contains)
<div id="root">
<input type="text" name="first_name" v-model="FirstName">
<input type="text" name="last_name" v-model="LastName">
// (before edit) <script src="main.js"></script>
// (before edit) <script src="register.js"></script>
<script src="{{ mix('/main.js') }}"></script>
<script src="{{ mix('/register.js') }}"></script>
</div>
// main.js (contains)
// (before edit) import Vue from 'node_modules/vue/dist/vue.js';
// (before edit) window.Vue = Vue;
window.Vue = require('vue');
// register.js (contains)
const app = Vue.createApp({
setup() {
const FirstName = Vue.ref('');
const LastName = Vue.ref('');
const FullName = Vue.computed(() => FirstName.value + ' ' + LastName.value);
return {
FirstName, LastName, FullName
}
}
});
app.mount('#root');
这对于这个简单的例子来说很好,但我想知道前缀 Vue. 的方法是否正确?是否可以使用该方法访问 Vue 为 setup() 方法公开的所有函数?
编辑: 我正在使用 laravel mix 包装的 webpack,为了简单起见,我从初始代码中删除了它,但我认为它被证明是相关的。对最初提供的代码中的编辑进行注释以避免混淆。
// webpack.mix.js (contains)
mix.webpackConfig({
resolve: {
alias: {
'vue$': path.resolve(__dirname, 'node_modules/vue/dist/vue.esm-bundler.js'),
}
}
});
mix.js('resources/main.js', 'public/main.js')
.js('resources/register.js', 'public/register.js')
.version();
【问题讨论】:
标签: javascript vue.js webpack vuejs3 vue-composition-api