Use vite to build a vue3 projectYou can quickly build a Vue project using Vite by running the following command in your terminal. $ npm init vite-app <project-name> $ cd <project-name> $ npm install $ npm run dev Introducing Element PlusInstall Element Plus: npm install element-plus --save Element Plus is fully introduced in main.js: import { createApp } from 'vue' import ElementPlus from 'element-plus'; import 'element-plus/lib/theme-chalk/index.css'; import App from './App.vue'; const app = createApp(App) app.use(ElementPlus) app.mount('#app') Importing SCSSRun the command to install sass, npm i sass -D, and then add lang="scss" to the style tag of the vue file. These are the same as before vue2. npm i sass -D Import eslintInstall eslint npm i eslint -D Use eslint to initialize this project npx eslint --init Follow the prompts to set up, this is the setting I chose Import vue-routerInstall Vue Router 4 npm install vue-router@4 Create a new router folder in the src directory, and create index.js under router for routing configuration import * as VueRouter from 'vue-router' const routes = [ { path: '/', component: () => import('../page/Home.vue') }, { path: '/login', component: () => import('../page/Login.vue') } ] export default VueRouter.createRouter({ history: VueRouter.createWebHashHistory(), routes }) Use this middleware in main.js import router from './router' //... app.use(router) Import vuexInstall vuex npm install vuex@next --save Create a store path under src and create index.js under store import { createStore } from 'vuex' export default createStore({ state () { return { username: '' } }, mutations: setUserName (state, payload) { state.username = payload } } }) Use store in main.js import vuex from './store' //... app.use(vuex) Importing AxiosFor network requests, axios is used here. First, install axios npm i axios Create an api directory under the src directory, create axios.js under the api path, and configure the axios instance // axios.js import axios from 'axios' // import config from '../../config' import { useRouter } from 'vue-router' export default function () { // 1. When sending a request, if there is a token, it needs to be attached to the request header const token = localStorage.getItem('token') let instance = axios if (token) { instance = axios.create({ // baseURL: config.server, headers: { authorization: 'Bearer ' + token } }) } const router = useRouter() instance.interceptors.response.use( (resp) => { // 2. When responding, if there is a token, save the token locally (localstorage) if (resp.data.data.token) { localStorage.setItem('token', resp.data.data.token) } // 3. When responding, if the response message code is 403 (no token, token invalid), delete the token locally if (resp.data.code === 403) { localStorage.removeItem('token') localStorage.removeItem('username') router.push({ name: 'Login' }) } return resp }, (err) => { return Promise.reject(err) } ) return instance } Create index.js under the api path and write the api import request from './axios.js' import config from '../../config' export default { // Login login (params) { return request().post(`${config.server}/login`, params) }, // Get the user list getUserList (params) { return request().get(`${config.server}/user/list`, { params: params }) }, // Add a user createUser (params) { return request().post(`${config.server}/user/`, params) }, //... Next, we use the composition API of vue3 to develop components. Here is an example of the development of a User module: <template> <div class="user-wrap"> <el-button class="create-btn" type="success" size="small" @click="handleCreate">Add user+</el-button> <el-table :data="tableData" style="width: 100%"> <el-table-column label="Username" prop="username"> </el-table-column> <el-table-column label="Password" prop="password"> </el-table-column> <el-table-column align="right"> <template #header> <el-input v-model="search" @blur="searchUser" size="mini" placeholder="Enter username to search"/> </template> <template #default="scope"> <el-button size="mini" @click="handleEdit(scope.$index, scope.row)">Edit</el-button> <el-button size="mini" type="danger" @click="handleDelete(scope.$index, scope.row)">Delete</el-button> </template> </el-table-column> </el-table> <el-pagination :hide-on-single-page="hideOnSinglePage" class="page-wrap" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="currentPage" :page-sizes="[10, 20, 30, 40]" :page-size="pageSize" layout="total, sizes, prev, pager, next, jumper" :total="totalCount"> </el-pagination> <el-dialog title="User Information" v-model="dialogFormVisible"> <el-form :model="form"> <el-form-item label="Username" :label-width="formLabelWidth"> <el-input v-model="form.username" autocomplete="off"></el-input> </el-form-item> <el-form-item label="Password" :label-width="formLabelWidth"> <el-input v-model="form.password" autocomplete="off"></el-input> </el-form-item> </el-form> <template #footer> <span class="dialog-footer"> <el-button @click="dialogFormVisible = false">Cancel</el-button> <el-button type="primary" @click="confirmUser">Confirm</el-button> </span> </template> </el-dialog> </div> </template> <script> import { ref, computed } from 'vue' import api from '../../../api/index' import { ElMessage, ElMessageBox } from 'element-plus' export default { setup () { let status = '' let userId = null const formLabelWidth = ref('120px') // Get user list const tableData = ref([]) async function getList (params) { const res = await api.getUserList(params) if (res.data.success) { tableData.value = res.data.data.userList totalCount.value = res.data.data.count search.value = '' } else { ElMessage.error('Failed to get user list:' + res.data.msg) } } getList() const form = ref({ username: '', password: '' }) const dialogFormVisible = ref(false) // Submit user information async function confirmUser () { // Verify that the information is complete if (!(form.value.username && form.value.password)) { ElMessage.error('Incomplete form information') return } switch (status) { case 'create': createUser(form.value) break case 'edit': updateUser(userId, form.value) break } } // Add user async function handleCreate () { form.value = { username: '', password: '' } dialogFormVisible.value = true status = 'create' } // Add user information async function createUser (params) { const res = await api.createUser(params) if (res.data.success) { getList() ElMessage.success({ message: 'Added successfully', type: 'success' }) dialogFormVisible.value = false } else { ElMessage.error('Add failed:' + res.data.msg) } } // Edit user async function handleEdit (index, row) { console.log(index, row) dialogFormVisible.value = true status = 'edit' form.value.username = row.username form.value.password = row.password userId = row.id } // Modify user information async function updateUser (id, params) { const res = await api.updateUser(id, params) if (res.data.success) { ElMessage.success({ message: 'Modification successful', type: 'success' }) getList() dialogFormVisible.value = false } else { ElMessage.error('Modification failed: ' + res.data.msg) } } // Delete user const handleDelete = async (index, row) => { ElMessageBox.confirm('This operation will permanently delete the user, do you want to continue?', 'Prompt', { confirmButtonText: 'Confirm', cancelButtonText: 'Cancel', type: 'warning' }).then(async () => { await delUser(row.id) }).catch(() => { ElMessage({ type: 'info', message: 'Deleted' }) }) } // Delete user information async function delUser (id) { const res = await api.delUser(id) if (res.data.success) { getList() ElMessage.success({ type: 'success', message: 'Deleted successfully!' }) } else { ElMessage.error('Delete failed: ' + res.data.msg) } } // Search user const search = ref('') async function searchUser () { currentPage.value = 1 pageSize.value = 10 if (search.value === '') { getList({ pageindex: currentPage.value, pagesize: pageSize.value }) return } currentPage.val = 1 const res = await api.findUserByUsername({ username: search.value }) if (res.data.success) { tableData.value = res.data.data.userList ElMessage.success({ message: 'Search successful', type: 'success' }) } else { ElMessage.error('Modification failed: ' + res.data.msg) } } // Paging related const totalCount = ref(0) const currentPage = ref(1) const pageSize = ref(10) function handleSizeChange (val) { pageSize.value = val getList({ pageindex: currentPage.value, pagesize: val }) } function handleCurrentChange (val) { currentPage.value = val getList({ pageindex: val, pagesize: pageSize.value }) } // Hide the paging plugin if there are more than one page const hideOnSinglePage = computed(() => { return totalCount.value <= 10 }) return { tableData, search, dialogFormVisible, form, formLabelWidth, createUser, handleEdit, handleDelete, confirmUser, handleCreate, searchUser, currentPage, totalCount, handleSizeChange, handleCurrentChange, pageSize, hideOnSinglePage } } } </script> <style lang="scss" scoped> .user-wrap{ width: 100%; min-width: 500px; .create-btn{ margin-bottom: 10px; display: flex; justify-content: flex-end; } .page-wrap{ margin-top: 10px; } } </style> This is the end of this article about the steps to build the vite+vue3+element-plus project. For more relevant vite building vue3+ElementPlus content, please search for previous articles on 123WORDPRESS.COM or continue to browse the following related articles. I hope everyone will support 123WORDPRESS.COM in the future! You may also be interested in:
|
<<: Detailed tutorial on installing Docker and nvidia-docker on Ubuntu 16.04
>>: Detailed explanation of how to implement secondary cache with MySQL and Redis
Structural (position) pseudo-class selector (CSS3...
HTML meta tag HTML meta tags can be used to provi...
Deploy nginx with docker, it's so simple Just...
There are two types: (different browsers) 1. Avail...
Detailed explanation of the implementation method...
How to make a simple web calculator using HTML, C...
When I first started designing web pages using XH...
This article shares the specific implementation c...
Normal explanation % means any client can connect...
Table of contents 1. Object properties 1.1 Attrib...
This article shares the specific code of JavaScri...
CSS: 1. <link type="text/css" href=&q...
The operating environment of this tutorial: Windo...
Given a div with the following background image: ...
How to check the file system type of a partition ...