我的VUE 学习之路(下)

news2024/11/19 17:04:55

前言:

        在经历过前面在HTML下的VUE相关基础的洗礼后,我们可以动手去做一些事了,此时发现直接通过直接VUE组件方式与之前在HTML不同,首先要“静一静”,细看之下只是对之前的很多写法做了封装。

        本文旨在直接上手Vue项目下做测试而非前面的那种方式。

预期目标:VUE项目开发的基本理解

使用工具:HBuilder

学习前技术储备:VUE 在HTML下的使用

零、准备

下载与配置Vue CLI

注意事项:

创建项目时如果提示:无法加载文件 vue.ps1.......

解决方案:

1.以管理员身份打开windows PowerShell 

2.输入:set-ExecutionPolicy RemoteSigned 

3.选择y或者a

4.回车 就可以了

一、Vue 项目走步

1.1.项目创建

 1.在对应的目录上支行CMD或终端

2.输入 vue create XXX                                        [xxx 是项目名称]

3.选择配置(如下图)通常情况下需要手动配置

 4.手动配置 选项说明

        4.1Babel (默认选中)(选中)

        4.2 TypeScript  --TS库 

        4.3 Progressive Web App...

        4.4 Router        --路由组件(建议选中)

        4.5 Vuex           --状态组件(建议选中)

        4.6 CSS Pre-processors  --样式管理(建议选中)

        4.7 Linter / Formatter(默认选中)(个人不推荐 稍有错误就会提示错误,影响开发速度)

        4.8 Unit Testing  --测试

        4.9 E2E Testing  --测试

5.创建就慢慢等

6.创建后可以使用WebStrom 、VScode 、Hbuilder以项目的打开(导入)就可以了

1.2.项目结构

1.3.项目文件

 系统处理顺序个人理解是:public/index.html  -> main.js->App.vue(如果不对请留言指正)

1.4.项目示例

HomeView.vue 文件调用模组Demo.vue

<template>
  <div class="home">
    <img alt="Vue logo" src="../assets/logo.png">
<!--    <HelloWorld msg="Welcome to Your Vue.js App"/>-->
    <demo></demo>
  </div>
</template>

<script>
// @ is an alias to /src
// import HelloWorld from '@/components/HelloWorld.vue'
import Demo from '@/components/Demo'

export default {
  name: 'HomeView',
  components: {
    // HelloWorld,
    Demo
  }
}
</script>
<template>
  <div>
    {{msg}}
    <input type="text" ref="mytest">
    <button @click="test()">测试</button>
    <ul>
      <li v-for="data in inputData" :key="data">{{data}}</li>
    </ul>
  </div>
</template>
<script>
// 接口
export default {
  // eslint-disable-next-line vue/multi-word-component-names
  name: 'Demo',
  // 数据层
  data () {
    return {
      msg: '这是一个Demo',
      inputData: []
    }
  },
  // 事件
  methods: {
    test () {
      // eslint-disable-next-line no-sequences,no-unused-expressions
      console.log(this.$refs.mytest.value),
      this.inputData.push(this.$refs.mytest.value)
    }
  }
}
</script>

二、反向代理概念

它存在的意义在于解决跨域问题,主要是通过修改vue.config.js 处理。

(ps:修改后要重新启动一下才生效

const { defineConfig } = require('@vue/cli-service')
// 示例解决 http://t.163.move/getMove/getById?10
module.exports = defineConfig({
  transpileDependencies: true,
  devServer: {
    proxy: {
      '/getMove': { // API标识
        target: 'http://t.163.move', // 代理标识
        // wss: true,
        changeOrigin: true
      }
    }
  }
})

// 调用 axios.get("/getMove/getById?10").then(res=>{res.data})

三、路由

        路由顾名思意就是负责转发或跳转的,与我们生活中的路由器的工作方式相同;在下载的文件中包含了一个示例(router\index.js),所有接受路由的地方需要用<router-view></router-view>容器接收。

 一级路由

        其实VUE在创建时就给示出一个一级路由实例;

        App.vue

<template>
  <div id="app">
    <nav>
      <router-link to="/">Home</router-link> |
      <router-link to="/about">About</router-link> |
    </nav>
    <router-view/>
  </div>
</template>

<style lang="scss">
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
}

nav {
  padding: 30px;

  a {
    font-weight: bold;
    color: #2c3e50;

    &.router-link-exact-active {
      color: #42b983;
    }
  }
}
</style>

       router\index.js

import Vue from 'vue'
import VueRouter from 'vue-router'
import HomeView from '../views/HomeView.vue'


Vue.use(VueRouter)

const routes = [
  {
    path: '/',//访问路径
    name: 'home',//命名
    component: HomeView //外部注册 这里直接使用
  },
  {
    path: '/about',
    name: 'about',
    component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')//内部引用
  }
]

const router = new VueRouter({
  mode: 'history',//路由模式  展示方式
  base: process.env.BASE_URL,
  routes
})

export default router

        

 多级路由

作用:用于访问子路径  通常使用在二级目录配置

Demo.vue 模拟父(注意定义对应接收标签)

<template>
  <div>
    这是一个Demo 为的是展示二级(多级)路由
    <!--    设置好容器-->
    <router-view></router-view>
  </div>
</template>

定义两个子组件 A.vue  与B.vue

<template>
  <div> A </div>
</template>
<template>
  <div>B</div>
</template>

配置路由新增


  {
    path: '/demo',
    name: 'demo',
    component: Demo,
    children:[
        {
          path:'a',
          name:'a',
          component:A
        },
      {
        path:'b',
        name:'b',
        component:B
      }
    ]
  }

动态路由

用途:主要用于路径是变化,但格式固定,通常使用在列表中的详情页

ProductDetail.vue 模拟产品详情

<template>
  <div>
    这是一个组件
    <div> {{id}}</div>
  </div>
</template>
<script>
export default {
  data(){
    return{
      id:""
    }
  },
  mounted(){
    this.id=this.$route.params.id
  }
}
</script>

AboutView.vue 模拟数据(产品)列表页,用于发出明细请求

<template>
  <div class="about">
    <h1>This is an about page</h1>
    <ul>
      <li v-for="data in list" :key="data.id" @click="theProduct(data.id)">
        {{data}}
      </li>
    </ul>
  </div>
</template>
<script>
export default {
  data(){
    return{
      list:[{id:1,code:"aa"},{id:2,code:"bb"},{id:3,code:"cc"}]
    }
  },
  methods:{
    theProduct(id){
      this.$router.push(`/detail/${id}`)//指向router这个目录下的配置实现跳转  动态路由方式1
      //this.$router.push({name:"detail",params:{id:id}})//动态路由方式2 通过命名路由方式跳转
    }
  }
}
</script>

路由配置

import Vue from 'vue'
import VueRouter from 'vue-router'
import HomeView from '../views/HomeView.vue'
import ProductDetail from '../components/ProductDetail'

Vue.use(VueRouter)

const routes = [
  {
    path: '/',//访问路径
    name: 'home',//命名
    component: HomeView //外部注册 这里直接使用
  },
  {
    path: '/about',
    name: 'about',
    component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')//内部引用
  },
  {
    path:'/detail/:id',
    name:'detail',
    component: ProductDetail
  }
  
]

const router = new VueRouter({
  mode: 'history',//路由模式  展示方式
  base: process.env.BASE_URL,
  routes
})


export default router

 路由拦截

作用:路由前的校验,一般用于登陆等

如下代码在路由js中添加进去代表当不是demo路径的访问就放行

//路由拦截配置
 router.beforeEach((to,from,next) =>{
   if (to.name !=='demo'){
     next()
   }
 })

路由定向

作用:当访问未在路由内部配置的路径时要自动指向指定的路径

如下配置当访问 .../demo/c的时候自动转向.../demo这个路径上

{
    path: '/demo',
    name: 'demo',
    component: Demo,
    children:[
        {
          path:'a',
          name:'a',
          component:A
        },
      {
        path:'b',
        name:'b',
        component:B
      },
      {
        //重定向
        path: '*',
        redirect:'/demo'
      }
    ]
  }

全部示例代码

components\productDetail.vue

<template>
  <div>
    这是一个组件
    <div> {{id}}</div>
  </div>
</template>
<script>
export default {
  data(){
    return{
      id:""
    }
  },
  mounted(){
    this.id=this.$route.params.id
  }
}
</script>

router\index.js

import Vue from 'vue'
import VueRouter from 'vue-router'
import HomeView from '../views/HomeView.vue'
import ProductDetail from '../components/ProductDetail'
import Demo from '../views/Demo'
import A from '../views/Demo/A'
import B from '../views/Demo/B'

Vue.use(VueRouter)

const routes = [
  {
    path: '/',//访问路径
    name: 'home',//命名
    component: HomeView //外部注册 这里直接使用
  },
  {
    path: '/about',
    name: 'about',
    component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')//内部引用
  },
  {
    path:'/detail/:id',
    name:'detail',
    component: ProductDetail
  },
  {
    path: '/demo',
    name: 'demo',
    component: Demo,
    children:[
        {
          path:'a',
          name:'a',
          component:A
        },
      {
        path:'b',
        name:'b',
        component:B
      },
      {
        //重定向
        path: '*',
        redirect:'/demo'
      }
    ]
  },
    //重定向:在顶级目录中不存在的数据自动指向首页
  {
    path: '*',
    redirect:'/'
  }
]

const router = new VueRouter({
  mode: 'history',//路由模式  展示方式
  base: process.env.BASE_URL,
  routes
})
//路由拦截配置
// router.beforeEach((to,from,next) =>{
//   if (to.name !=='demo'){
//     next()
//   }
// })

export default router

views\AboutView.vue

<template>
  <div class="about">
    <h1>This is an about page</h1>
    <ul>
      <li v-for="data in list" :key="data.id" @click="theProduct(data.id)">
        {{data}}
      </li>
    </ul>
  </div>
</template>
<script>
export default {
  data(){
    return{
      list:[{id:1,code:"aa"},{id:2,code:"bb"},{id:3,code:"cc"}]
    }
  },
  methods:{
    theProduct(id){
      this.$router.push(`/detail/${id}`)//指向router这个目录下的配置实现跳转  动态路由方式1
      //this.$router.push({name:"detail",params:{id:id}})//动态路由方式2 通过命名路由方式跳转
    }
  }
}
</script>

views\Demo.vue

<template>
  <div>
    这是一个Demo 为的是展示二级(多级)路由
    <!--    设置好容器-->
    <router-view></router-view>
  </div>
</template>

views\Demo\A.vue

<template>
  <div> A </div>
</template>

views\Demo\B.vue

<template>
  <div>B</div>
</template>

App.vue

<template>
  <div id="app">
    <nav>
      <router-link to="/">Home</router-link> |
      <router-link to="/about">About</router-link> |
      <router-link to="/detail">detail</router-link>
    </nav>
    <router-view/>
  </div>
</template>

<style lang="scss">
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
}

nav {
  padding: 30px;

  a {
    font-weight: bold;
    color: #2c3e50;

    &.router-link-exact-active {
      color: #42b983;
    }
  }
}
</style>

四、Vuex

vuex 是Vue家族中的状态管理工具。PC端常用于权限管理,移动端则多数用于懒加载。其配置文件前文已介绍就是store目录下的index.js文件。请大家看我针对这个文件的注释

import Vue from 'vue'//引用vue
import Vuex from 'vuex'//引用状态管理
import axios from 'axios'

Vue.use(Vuex) //加载


//导出
export default new Vuex.Store({
  state: {
    //---------------作用:共享数据    第三个加载
    productList:[]
  },
  getters: {
    //---------------作用:数据二次加工方法
    getProductListTop3(state){
      return state.productList.filter((item,index)=>index<4)
    }
  },
  mutations: {
    //---------------作用:配置系统常量比如登陆的账户信息、权限信息等  第二个加载
    setProductList(state,data){
      state.productList=data
    }
  },
  actions: {
    //---------------作用:异步加载 条件执行,常用于懒加载  第一个加载
    getProductList(store){
      axios({
        url:"http://127.0.0.1:2022/company-work-time/findByCompanyId?companyId=74"
      }).then(res=>{
        //state.productList=res.data;
        store.commit("setProductList",res.data.data)
        console.log(res.data.data)
      })
    }
  },
  modules: {
    //---------------状态树,暂时用不到,一般较大项目使用,相当于声明一个子对象一样包含state\getters...
  }
})

1.先加载actions,它主要用于做数据请求。

2.请求过来的数据通过mutations的方法把数据存入state中的变量中去。

3.如果前端需要二次处理,则把方法写在getters中去。

示例

App.vue

<template>
  <div id="app">
    <nav>
      <router-link to="/">Home</router-link> |
      <router-link to="/about">About</router-link> |
      <router-link to="/storeDemo">storeDemo</router-link>
    </nav>
    <router-view/>
  </div>
</template>

<style lang="scss">
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
}

nav {
  padding: 30px;

  a {
    font-weight: bold;
    color: #2c3e50;

    &.router-link-exact-active {
      color: #42b983;
    }
  }
}
</style>

StoreDemo.vue

<template>
  <div>
    <h3>演示状态管理</h3>
    <h5>1:懒加载</h5>
    <ul>
      <li v-for="data in $store.state.productList" :key="data.id">
        {{data}}
      </li>
    </ul>
  </div>
</template>
<script>
  export default {
    data(){
      return{
        pList:[]
      }
    },
    mounted() {
      if (this.$store.state.productList.length===0){
        this.$store.dispatch("getProductList")
      }else {
        console.log("启用缓存数据")
        this.pList=this.$store.state.productList
      }
    }
  }
</script>

五、elementUI 、MintUI

其实这方面的教程非常多,而且官方相当详尽,在这里只是给大家提醒有这么一个东西,首先它是界面优化的(可以理解为基于VUE的皮肤),Element 是针对PC端的,Mint是针对移动端的。以下是官方连接方便大家查用

Element UI

Mint UI

总结

个人觉得VUE最大的亮点:

1.组件化开发【像是乐高积木,越细分越灵活】

2.数据双向绑定

结论:

作为一名开发人员不应该抱着固有的思想看问题,一项技术出来并且有生命力指定有它的先进性,我们要主动拥抱它!我遇到很多技术人员总在讲:“XXXX已经足够用了”、“用XXX也能实现这个需求(除了麻烦点)”,更有过者讲:“XXX不好用(其实用都没有用过就发表看法)”............遇到这些人我们尽量远离切不可与之争论,因为这些负能量会影响到你!

文未提醒大家这是我学习近两周后的一些个人心得与技术总结,难免有一些差错,届时希望大家批评指正,同时原创不易,欢迎收藏转发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/409019.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FormData详解

FormData 接口提供了一种表示表单数据的键值对 key/value 的构造方式&#xff0c;并且可以轻松的将数据通过XMLHttpRequest.send() 方法发送出去&#xff0c;本接口和此方法都相当简单直接。如果表单 enctype 属性设为 multipart/form-data &#xff0c;则会使用表单的 submit(…

vue项目控制台报错信息问题记录:Uncaught TypeError: Cannot read properties of null (reading ‘setAttribute‘)

在写vue项目的时候&#xff0c;控制台总是报错如下代码&#xff1a; 1、Uncaught TypeError: Cannot read properties of null (reading ‘setAttribute‘) 主要是因为某些代码书写不规范&#xff0c;导致templete解析不出来&#xff0c;从而报错 解决方案&#xff1a; 检查下…

uniapp 实现生成海报并分享给微信好友和保存到本地相册

记录uniapp 生成二维码海报并保存到本地或者分享给微信好友 – 文章目录记录uniapp 生成二维码海报并保存到本地或者分享给微信好友前言一、引入生成二维码的组件二、点击右侧的分享图标生成海报三&#xff1a;将canvas 图片转化成图片&#xff08;最关键&#xff09;四&#…

el-tree设置利用setCheckedNodes/setCheckedKeys默认勾选节点,以及通过setChecked新增勾选指定节点

实现目标&#xff1a;在生成el-tree时&#xff0c;默认勾选其中某几个选项&#xff1b;或在进行某个选项的选中时&#xff0c;同时勾选上另一个选项。 实现效果&#xff1a; 在生成树结构时&#xff0c;默认勾选其中的两个选项。 在勾选其中一个选项时&#xff0c;另一个选项…

微前端之 qiankun 入门、上手、实战(构建大型 web 应用)

目录 前言 正文 一、介绍 微前端 qiankun 二、快速上手 ​☛主应用 ① 安装 qiankun ② 在主应用中注册微应用 ​☛微应用 ① 导出相应的生命周期钩子 ② 配置微应用的打包工具 三、项目实战 ​☛主应用 ① 安装 qiankun ② 注册微应用并启动 ③ 主应用添加…

ES6--》对象扩展方法

目录 对象扩展 name 属性 属性的遍历 super关键字 Object.is() Object.assign() Object.getOwnPropertyDescriptors() Object.setPrototypeOf() Object.getPrototypeOf() Object.keys()、Object.values、Object.entries()、Object.fromEntries() Object.hasOwn() 对…

如何在 2022 年为 Web 应用程序选择技术堆栈

文章目录什么是技术堆栈&#xff1f;为 Web 开发选择技术堆栈时要考虑的事项选择熟悉的技术跟随趋势考虑项目的细节确保高安全级别记住你的最后期限选择前端技术栈框架编程语言选择后端技术栈编程语言数据库技术堆栈是您应用程序的核心选择最佳的 Web 应用程序堆栈并非易事&…

vue3+ts遇到的小问题

插件volar安装了没有提示。 解决&#xff1a;1. 检查是或否是最新的版本&#xff0c;是的话进入拓展设置&#xff0c;所有的选项都勾选 2. 还是不行就要更新vscoe了。一般的话会在力捕抓到一个错误。跟新就好了 TypeScript intellisense is disabled on template. To enab…

【简陋Web应用2】人脸检测——基于Flask和PaddleHub

文章目录&#x1f6a9; 前言&#x1f33a; 效果演示&#x1f966; 分析与设计&#x1f349; 实现&#x1f36c; 1. 部署人脸检测模型&#x1f36d; 2. 使用Flask构建app2.1 目录结构2.2 forms.py2.3 utils.py2.4 app.py2.5 index.html&#x1f95d; Bug(s)&#x1f6a9; 前言 本…

Vue根据网络文件路径下载文件【自定义属性 v-down】

Vue根据网络文件路径下载文件【v-down】标准使用方式企业级Vue开发集成(全局挂载)1.src目录下创建directive文件夹&#xff08;存在则忽略&#xff09;2.down.js文件3.directive根目录创建index.js文件4.main.js 注册自定义属性全局挂载提到下载文件大家首先肯定会想到 模拟点击…

vue2 使用 cesium 篇 【第一篇】

vue2 使用 cesium 篇 今天好好写一篇哈&#xff0c;之前写的半死不活的。首先说明&#xff1a;这篇博文是我边做边写的&#xff0c;小白也是&#xff0c;实现效果会同时发布截图&#xff0c;如果没有实现也会说明&#xff0c;仅仅作为技术积累&#xff0c;选择性分享&#xff0…

面试官:“ES6中新增的Set方法去重你会吗?”我:“看文章就知道了”

赶快悄悄的努力起来吧,不苒在这里衷心祝愿各位大佬都能顺利通过面试。 面试专栏分享,感觉有用的小伙伴可以点个订阅,不定时更新相关面试题:面试专栏 。 文章目录 Set 的基本使用🍔前言🍏正文1. Set1.1 Set的基本使用1.2 Set 常见的属相和方法1.3 应用场景:使用Set对数…

vue组件通信2 | 父子组件通信v-model

引言&#xff1a;最近项目在vue2 升级vue3 &#xff0c;在这个过程中发现v-model 的变化最大。同时也发现了对于v-model 的不熟悉。 因此&#xff0c;本文从文档、vue2的使用方法、vue2 tsx 的使用方法、vue3的使用方法、使用场景来试图探究一下v-model。 一、文档及vue2中 v-…

vue页面刷新

vue页面刷新 首先我们都知道vue属于单页面应用&#xff0c;默认境况下是不会触发刷新页面操作的&#xff0c;所以这个时候就需要我们通过事件来触发reload()来达到刷新操作 接下来我就为大家介绍三种刷新页面的方法 1. wiindow.location.reload([bForceGet])该方法强迫浏览…

vue中组件的name属性含义与用法

vue中组件的name属性含义与用法 name属性&#xff1a;只有作为组件选项时起作用&#xff0c;用来注册组件名 1、注册组件名 局部注册组件&#xff0c;语法&#xff1a;export default{ components:{"组件名":组件对象}} 其中&#xff0c;"组件名"注册方…

从0搭建Vue3组件库(五): 如何使用Vite打包组件库

本篇文章将介绍如何使用 vite 打包我们的组件库,同时告诉大家如何使用插件让打包后的文件自动生成声明文件(*.d.ts) 打包配置 vite 专门提供了库模式的打包方式,配置其实非常简单,首先全局安装 vite 以及vitejs/plugin-vue pnpm add vite vitejs/plugin-vue -D -w 在 componen…

基于Vue+Nodejs实现宿舍管理系统

​ 作者主页&#xff1a;编程指南针简介&#xff1a;Java领域优质创作者、CSDN博客专家 Java项目、简历模板、学习资料、面试题库、技术互助文末获取源码​ 项目编号&#xff1a;BS-QD-002 主要需求&#xff1a; 学生信息录入、修改、删除、查询宿舍管理评分学生早起率、懒…

js之promise

##### 仅做记录复习使用 #### 数据有点混乱 暂时不要看 promise promise是一个对异步操作进行封装并返回其结果的构造函数. 使代码更加简洁和避免回调地狱。 promise是浏览器引擎自带的&#xff08;但不是所有浏览器都支持promise&#xff09; promise的参数是一个函数且…

全网详细解决Set-Location : 找不到接受实际参数“xxx”的位置形式参数。 所在位置 行:1 字符: 1的错误,并深究该错误的原因。

文章目录1. 复现错误2. 分析错误3. 解决问题4. 文末总结1. 复现错误 今天使用PowerShell从C:\Users\baoya>目录切换到C:\Program Files\MySQL\MySQL Server 5.7\bin时&#xff0c;却报出如下图的错误&#xff1a; 即找不到接受实际参数“Files\MySQL\MySQL”的位置形式参数。…

vue最易理解且详细的调用swiper插件

我们最开始接触的是在操作dom时候的时候引入swiper,那么这次我就用之前的文档来教你在vue中如何调用swiper. 我们之前看的是swiper教程 那么我根据上面的教程一步一步来教你使用 1.首先创建好swiper组件.写好template 里面的标签内容(当然这里写了个插槽为了以后方便动态插入…