您现在的位置是:首页 >学无止境 >Vue学习记录网站首页学无止境

Vue学习记录

这个程序猿可太秀了 2024-06-17 10:13:44
简介Vue学习记录

目录

基础概念

VUE

了解vue-vue脚手架vue-cli

项目结构:

VUE语法

初识VUE

VUE指令

组件

语法

核心插件

axios

Vuex

Vue Router路由管理器

elementui

项目demo快速上手


基础概念

前后端分离 :核心思想是前端页面通过 ajax 调用后端的 restuful api 进行数据交互

单页面应用(single page web application,SPA):就是只有一张页面,并在用户与应用程序交互时动态更新该页面的 Web 应用程序

HTML:页面,定义了网页的内容 HTML 教程 | 菜鸟教程

JS: 控制了网页的行为的编程语言  JavaScript 教程 | 菜鸟教程

TS:可以简单理解为有类型的js,最近挺火 TypeScript 中文手册 - TypeScript 中文手册

CSS:样式,描述了网页的布局 CSS 教程 | 菜鸟教程

ps:这么多?怎么学的完?简单看下知道基础就行了,毕竟谁会手写呢?大概2-3天的学习即可开发项目

vue只有一个html,整个项目只有这一个 html 文件,所以vue是一个单页面应用,当我们打开这个应用,表面上可以有很多页面,实际上它们都只不过在一个 div

VUE

vue官网:Vue.js - 渐进式 JavaScript 框架 | Vue.js

了解vue-vue脚手架vue-cli

Vue 脚手架是 Vue 官方提供的标准化开发工具/平台,有命令行 / 界面的两种操作方式,ps:我还是习惯用idea

vue-cli 安装 :npm install -g @vue/cli ,需要提前安装node

创建项目:vue create vuedemo ,可以上下滑动选择参数

启动项目:npm run serve

项目结构:

脚手架结构, render函数,vue.config.js,package.json,vue.js和vue.runtime.xxx.js的区别,有兴趣在了解下就可以

有个package.json 需要注意下,这个类型maven的pom.xml,你在项目里安装插件会自动在package.json引入,也可以在package.json里面引入插件,然后右键运行run install

webpack 是以 webpack 为模板指生成项目,webpack是一个现代的JavaScript应用的静态模块打包工具。在package.json引入相应的webpack的包也可正常使用,vue3都在用vite?

VUE语法

初识VUE

VUE指令

指令的作用是,当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM

v-bind缩写为:,主要是动态绑定属性 ,我理解类似于我们在data()里面要定义一个imgUrl变量,然后这个图片链接就可以用变量了,写死对代码不友好

v-on缩写为@,用于监听 DOM 事件,比如说点击

v-once,只渲染元素和组件一次。随后的重新渲染,元素/组件及其所有的子节点将被视为静态内容并跳过(h5、微信小程序均不支持,不知道是啥玩意)

v-html,内容按普通 HTML 插入 - 不会作为 Vue 模板进行编译,微信小程序会被转为 rich-text,其实也是赋值,但是这个变量的字符串会被当做html插入

v-if,v-else,v-else-if ,就是if else,他指定了条件为true才渲染,否则不渲染,渲染多个元素,可以用的组合方式

v-show,和v-if区别?

还可以用v-bind + Class 与 Style的方式, Class 与 Style主要是一些样式,比如颜色大小,然后把样式封装成类或者方法去调用,一次还可以调用多个(通过数组的形式),这俩有啥区别?

列表渲染用v-for,可以实现基于一个数组来渲染一个列表,用法和java的循环差不多,并且可以拿到 value下表(h5从1开始,其他平台从0),name类似key,value值

组件

VUE用了很多组件,组件就是把js或者view封装起来通用化,我把它理解为 java 的工具类或者 jar 包

比如导航栏通用封装成一个组件(工具类),elementui封装了很多样式和方法(jar包)

然后你就可以在其他view脚本调用该组件,且是可以用 props 实现传参

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8"/>
    <title>组件的嵌套</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<div id="root">
</div>
</body>

<script type="text/javascript">
    Vue.config.productionTip = false

    //定义student组件
    const student = Vue.extend({
        template: `
          <div>
          <h2>学生名称:{{ name }}</h2>
          <h2>学生年龄:{{ age }}</h2>
          </div>
        `,
        data() {
            return {
                name: 'JOJO',
                age: 20
            }
        }
    })

    //定义school组件
    const school = Vue.extend({
        template: `
          <div>
          <h2>学校名称:{{ name }}</h2>
          <h2>学校地址:{{ address }}</h2>
          <student></student>
          </div>
        `,
        components: {
            student
        },
        data() {
            return {
                name: '尚硅谷',
                address: '北京'
            }
        }
    })

    //定义hello组件
    const hello = Vue.extend({
        template: `
          <h1>{{ msg }}</h1>
        `,
        data() {
            return {
                msg: "欢迎学习尚硅谷Vue教程!"
            }
        }
    })

    //定义app组件
    const app = Vue.extend({
        template: `
          <div>
          <hello></hello>
          <school></school>
          </div>
        `,
        components: {
            school,
            hello
        }
    })

    //创建vm
    new Vue({
        template: `
          <app></app>
        `,
        el: '#root',
        components: {
            app
        }
    })
</script>
</html>

语法

ref:用来给元素或子组件注册引用信息(id的替代者),应用在html标签上获取的是真实DOM元素,应用在组件标签上获取的是组件实例对象(vc)

<button @click="show" ref="btn1">点我输出ref</button>
  console.log(this.$refs.btn1)

props声明:就好像接口的参数,我在组件里定义好参数变量,使用时可以传参方式修改变量

使用v-model时要切记:v-model绑定的值不能是props传过来的值,因为props是不可以修改的

props传过来的若是对象类型的值,修改对象中的属性时Vue不会报错,但不推荐这样做

mixin混入:把多个组件共用的配置提取成一个混入对象,组件和混入对象含有同名选项时,这些选项将以恰当的方式进行“合并”,在发生冲突时以组件优先

plugin插件:用于增强Vue,包含install方法的一个对象,install的第一个参数是Vue,第二个以后的参数是插件使用者传递的数据,比如vuex就是插件,了解即可,后面很多插件都是封装好的

scoped样式:让样式在局部生效,防止冲突,一般不用再APP.vue里

<template>
  <div class="scopeddemo">
    <h2>学生姓名:{{ name }}</h2>
  </div>
</template>
<style scoped>
.scopeddemo {
  background-color: chartreuse;
}
</style>

WebStorage:我理解是js的缓存,或者说通过函数操作java对象的那种感觉

  1. 存储内容大小一般支持5MB左右
  2. 浏览器端通过Window.sessionStorage和Window.localStorage属性来实现本地存储机制
  3. SessionStorage窗口关闭消失,localStorage需手动清除
<script>
    let person = {name:"JOJO",age:20}
    function saveDate(){
        localStorage.setItem('msg','localStorage')
        localStorage.setItem('person',JSON.stringify(person))
    }
    function readDate(){
        console.log(localStorage.getItem('msg'))
        const person = localStorage.getItem('person')
        console.log(JSON.parse(person))
    }
    function deleteDate(){
        localStorage.removeItem('msg')
        localStorage.removeItem('person')
    }
    function deleteAllDate(){
        localStorage.clear()
    }
</script>

自定义事件:待学习

全局事件总线:一种组件间通信的方式,适用于任意组件间通信

核心插件

axios

全局反向代理,有axios和vue-resource(不维护了)两个库,先安装 npm install axios

主要是封装了 XMLHttpRequests / ajax 的 HTTP 库,用来像后端发请求

--直接在main.js添加代理,或者复杂规范点就新建一个config.js统一配置
import axios from 'axios'
axios.defaults.baseURL = 'http://localhost:8081/api'
Vue.prototype.$axios = axios
--可以有多个配置,之后可在其他组件中通过 this.$axios 发送数据
--可以在</script>里面写按钮触发调用了
methods: {
  login () {
    this.$axios
      .post('/login', {
        username: this.loginForm.username,
        password: this.loginForm.password
      })
      .then(successResponse => {
        if (successResponse.data.code === 200) {
          this.$router.replace({path: '/'})
        }
      })
      .catch(failResponse => {
      })
  }
}

插槽slot:一种组件间通信的方式,主要作用是让父组件可以向子组件指定位置插入html结构

有默认插槽、具名插槽、作用域插槽3种分类

Vuex

Vuex是什么

  1. 管理共享状态,专门在 Vue 中实现集中式状态(数据)管理的一个 Vue 插件,对 vue 应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信,npm i vuex

什么时候使用Vuex

  1. 多个组件依赖于同一状态
  2. 来自不同组件的行为需要变更同一状态

Vuex的基本使用:

  1. 初始化数据state,配置actions、mutations,操作文件store.js
  2. 组件中读取vuex中的数据:$store.state.sum
  3. 组件中修改vuex中的数据:$store.dispatch('action中的方法名',数据) 或 $store.commit('mutations中的方法名',数据)
--大致流程就这样,有很多用法,初学现在了解即可
const personAbout = {
  namespaced: true,//开启命名空间
  state: {...},
  mutations: {...},
  actions: {...}
}

const store = new Vuex.Store({
  modules: {
    countAbout,
    personAbout
  }
})

Vue Router路由管理器

路由 | Vue.js

什么东西?:简单理解就是来实现页面跳转的

安装vue-router,命令:npm i vue-router,应用插件:Vue.use(VueRouter)

什么是路由:就是一个kv的映射关系,k是路径,v是function 或 componen

分类:

  1. 后端路由:对应一个func,服务器接收到一个请求时,根据请求路径找到匹配的函数来处理请求,返回响应数据
  2. 前端路由:value 是 component,用于展示页面内容,当浏览器的路径改变时,对应的组件就会显示

每个vue文件你都要在router导入注册才能访问,要不然项目找不到这个vue

//该文件专门用于创建整个应用的路由器,最基本路由如下
import VueRouter from "vue-router";
import Home from '../components/Hello'
//创建并暴露一个路由器
export default new VueRouter({
    routes:[
        {
            path:'/',
            nsmr:'Hello',
            component:Hello
        }
    ]
})

elementui

引入elementui

-- 本地运行需要先下载npm i element-ui -S
--在main.js中引入,可以完整引入和按需引入,demo项目完整引入即可,只是代码体积的影响
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
 
Vue.use(ElementUI)

可以去element-ui官网找到合适的样式,copy代码,有时需要稍微改造自己需要的样式

项目demo快速上手

git地址:GitHub - hht-china/vue3-ts-demo

在demo的过程中也记录了一些知识点,整体学习周期大概在3天,这么短的时间可以写一个完成的项目吗

大多时候都用的开源项目模板,从头搭建实在太费功夫,github搜多vue3 admin 找到starts较多且喜欢的风格即可

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。