Steps to build the vite+vue3+element-plus project

Steps to build the vite+vue3+element-plus project

Use vite to build a vue3 project

You 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 Plus

Install 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 SCSS

Run 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 eslint

Install 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-router

Install 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 vuex

Install 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 Axios

For 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:
  • Vite builds projects and supports micro frontends
  • This article will show you what Vite does to the browser's request
  • Vite+Electron to quickly build VUE3 desktop applications
  • How to add Vite support to old Vue projects
  • Vite2.0 Pitfalls
  • Vue3.0+vite2 implements dynamic asynchronous component lazy loading
  • Implementation of vite+vue3.0+ts+element-plus to quickly build a project
  • Learn the principles of Vite

<<:  Detailed tutorial on installing Docker and nvidia-docker on Ubuntu 16.04

>>:  Detailed explanation of how to implement secondary cache with MySQL and Redis

Recommend

Examples of new selectors in CSS3

Structural (position) pseudo-class selector (CSS3...

Examples of some usage tips for META tags in HTML

HTML meta tag HTML meta tags can be used to provi...

How to deploy nginx with Docker and modify the configuration file

Deploy nginx with docker, it's so simple Just...

js to implement web calculator

How to make a simple web calculator using HTML, C...

The corresponding attributes and usage of XHTML tags in CSS

When I first started designing web pages using XH...

Vue implements adding watermark to uploaded pictures

This article shares the specific implementation c...

Does the % in the newly created MySQL user include localhost?

Normal explanation % means any client can connect...

Introduction to new ECMAscript object features

Table of contents 1. Object properties 1.1 Attrib...

JavaScript implements draggable modal box

This article shares the specific code of JavaScri...

JS, CSS style reference writing

CSS: 1. <link type="text/css" href=&q...

Summary of the differences between get and post requests in Vue

The operating environment of this tutorial: Windo...

CSS inheritance method

Given a div with the following background image: ...

Linux View File System Type Example Method

How to check the file system type of a partition ...