Veam
文章20
标签4
分类10
vue2笔记上

vue2笔记上

重新整理了一下vue2上


[TOC]

vue2

模板语法:

v-band: 动态绑定 可以给任何指绑定事件 简写: “ : “
v-mode: 双向数据绑定
v-if:
v-show:
什么时候用插值
标签体内容 比如 div p 等等

什么使用指令
指令语法标签属性使用

image-20230408221605717

让值大写表示 .toUpperCase()

数据绑定:

单项绑定:v-band:

双向绑定:v-mode
不是所有元素都能使用这个 v-mode 适合使用表单类的

el 和 data 的两种写法

//第一种写法el和data const v = new Vue({ el:"#root ", data:{ name:'1231', } }) console.log(v) //第二种写法的el const v = new Vue({ //el:"#root ", data:{ //对象式 name:'1231', } }) console.log(v) v.$mount("#root") //挂载 data的第二种写法 new Vue({ consolo.log(this) //此处的this是Vue实例函数 el:"#root", data:function(){ //函数式 简写: data(){ retrun : name : '123' } return{ name:'123' } } })

MVVM

数据代理

Object.defineProperty 方法
<script>
    let num = 18 //定义一个属性
    let pro = {
     name : '张三',
     sex:'男'
    }

Object.defineProperty(pro,'age',{
    value : 18, //追加到pro属性中的age
    enumberable:true,  //控制属性是否可以枚举,默认值是false
    writable:true,  //控制属性是否可以被修改,默认值是false
    configurable:true, //控制属性是否可以被删除,默认值是false

    //高级方法
    //当有人读取pro的age属性的适合,get函数(getter)就会被调用,且返回值就是age的值
    get:funtion(){
        return num
    }
    //当有人修改pro的age属性时,set函数(setter)就会被调用,且回收到修改的具体值
    set(value){
        num = values
        console.log('有人修改了我',value)
    }
})
//这个age是不可以枚举的 也就是不能遍历
</script>

Object.keys(pro)  // 检测对象
什么是数据代理

数据代理:通过一个对象代理对另一个对象中属性的操作(读/写)

<script>
    let obj1 = {x:10}
    let obj2 = {y:12}
    //我们通过object.defineProperty方法去修改obj2身上的x值取发生改变
    Object.defineProperty(obj2,'x',{
        get(){
            return obj1.x  //通过请求obj2去读取obj1身上的x
        }
        set(value){
            obj1.x = value  //通过请求obj2身上的x去修改obj1身上的x
        }
    })
</script>
vue 中的数据代理

事件处理

methods:{ //下面放的是事件处理方式 }

事件修饰符
preventDefault()    阻止默认行为

vue的阻止 @click.prevent

stopPropagation() : 阻止事件冒泡

vue的阻止冒泡 @click.stop
键盘事件

@keydown

@keyup

别名: enter delete esc space tab up down left right

event.keycode 键盘编码

meta 键盘就是 win 键

事件总结:

计算属性 - computed

  1. 要显示的数据不存在,要通过计算得来
  2. 在 computed 对象中定义计算属性
  3. 在页面中使用来显示计算的结果

完整写法:

computed:{ full:{ get(){ return this.abc }, set(value):{ this.abc = 1 } } }

简写:只读不该就用简写 省略 set 把 get 也直接省略

computed:{ full{ return this.abc + '-' + this.b } }

监视属性 - watch

handler(newValue,oldValue)  //handler什么时候调用?当我们被监视的函数发生改变的时候
-----------------------------------------------------------------------------------------
immediate: true //初始化时让后handler调用一下 是个布尔值
实例身上也可以用比如
vm.$watch('这里是一段语句',{ immediate:true, handler(newValue,oldValue){ console.log('这里是提示',newValue,oldValue) } })

深度监视

比如我有一个对象我要改变对象下面的一个值

正常写法

data:{
    num:{
        a:1,
        b:1,
    }
}
watch:{
    "num.a":{    //这里是多级的关系
        handler():{
            console.log('123')
        },
        deep:true, //默认是false深度监视
    }
}

监视的简写方式

watch{
    full(newValue,oldValue){
        console.log('123132')
    }
}
watch 对比 computed

绑定样式

理解:

  1. 在应用页面中,某个元素的样式是变化的
  2. class/style 绑定就是专门用来实现样式效果的技术
class 绑定
  1. :class = ‘xxx’ 动态绑定
  2. 表达式是字符串: classA 适用于:样式的类名不确定,需要动态绑定
  3. 表达式是对象: {classA:isA,classB:isB} 适用于要绑定的样式个数确定,名字也确定,单要动态决定用不用 falsetrue
  4. 表达式是数组: [‘classA’, ‘classB’] 使用的场景;要绑定的样式个数不确定,名字也不确定
style 绑定
  1. 表达式是对象语法 :style = “{color:activeColor,fontSize:fontSize + ‘px’}”

直接绑定到一个样式对象通常更好,这会让模板更清晰:

<div v-bind:style="styleObject"></div>

data: {
  styleObject: {
    color: 'red',
    fontSize: '13px'
  }
}

同样的,对象语法常常结合返回对象的计算属性使用。

  1. 表达式是数组语法 :style=”[baseStyles, overridingStyles]”

这样写只会渲染数组中最后一个被浏览器支持的值。在本例中,如果浏览器支持不带浏览器前缀的 flexbox,那么就只会渲染 display: flex

  1. 多重值(数组): :style=”{ display: [‘-webkit-box’, ‘-ms-flexbox’, ‘flex’] }”

条件渲染 (表达式要布尔值)

v-if 与 v-else (适用于切换频率低的)
实现隐藏
//节点上会消失
实现隐藏
//为真显示 v-if与template的配合
v-show (使用切换频率很高使用这个比较好)
实现隐藏
//节点上会不消失
实现隐藏
//为真显示

列表渲染

v-for

案例:

//遍历循环 【数组,对象,字符串,指定次数】
前面的item是遍历的每一项,index是索引号

in 也可以用 of 来使用

<ul v-for(item,index) in list :key="index>
    <li>{{ item }}</li>
</ul>

data:{
    list:[
        {
            a:'213',
        },
        {
            a:'21321313',
        },
        {
            a:'2132312s',
        }
    ]
}

key 作用与原理

列表过滤

一个字符串里面包含空字符串

列表过滤

vue 检测数据改变的原理

vue 检测对象属性的改变

vue 检测数据的原理就是 set
Api = Vue.set === vm.$set

Vue.set 有局限 不允许直接给 data 追加属性 也不许给实例身上添加

vue 监测数组属性的改变
直接通过索引去改变数组下的不会被改变 vue 检测到

回顾数组新增和删除 变更方法

Vue 将被侦听的数组的变更方法进行了包裹,所以它们也将会触发视图更新。这些被包裹过的方法包括:

新增最后一个元素 push
删除最后一个元素 pop
新增前面一个元素 unshift
删除前面一个元素 shift
在数组中删除,插入,替换某一个元素 splice
对数组进行排序 sort
反转数组 reverse

你可以打开控制台,然后对前面例子的 items 数组尝试调用变更方法。比如 example1.items.push({ message: 'Baz' })。

还可以用Vue.set方法
替换数组
变更方法,顾名思义,会变更调用了这些方法的原始数组。相比之下,也有非变更方法,例如 filter()、concat() 和 slice()。它们不会变更原始数组,而总是返回一个新数组。当使用非变更方法时,可以用新数组替换旧数组:
-----------------------------------------------------------------------------------------

example1.items = example1.items.filter(function (item) {
  return item.message.match(/Foo/)
})
总结 vue 监视数据

保留一个小细节
如果 vscode 是注释状态
我们需要折叠 可以用到 #region <!-------需要被折叠的代码----------> #endregion

收集表单数据 v-model

v-model 修饰符

number:转换 number 形
lazy:失去焦点再收集
trim:输入首行空格过滤

过滤器

filters
两种使用场景
第一种

v-band  :

第二种

{{}}  :插值语法
```

使用

```

{{time | abc()}}</h3> //这是不传递参数 <h3>{{time | abc('参数')}}</h3> //这是传递参数 <h3>{{time | abc('参数') | 函数 }}</h3> //这是传递参数

全局过滤器

Vue.filter('声明名字',function(value){
    return Value.slice(0,4)
})

局部过滤器

new Vue({
    data:{
        time:1231233,
    },
    filters:{
        abc(value,str='定义的参数'){
            //这里用到了一个组件库
            return dayjs(value).format(str)
        },
        函数(value){
            return value.split(0,4)
        }
    }
})

内置指令

v-text 指令
<div v-text="name"></div>  //执行abc

data:{
    name:'abc'
}

作用:向其所在的节点中渲染文本内容
与插值语法的却别:v-text 会替换节点中的内同 插值语法不会

复习一下学过的指令
v-bind : 单项绑定解析表达式,可简写为 :xxx
v-model : 双向数据绑定
v-for : 遍历数组/对象/字符串
v-on : 绑定事件监听,可以缩写@
v-if : 条件渲染(动态控制节点是否存在)
v-else : 条件渲染(动态控制节点是否存在)
v-show : 条件渲染(动态控制节点是否存在)
v-html

cloak 指令

v-once 指令

v-pre 指令

自定义指令_函数式

<div>
<h1 v-bin = 'n'>   </h1>
<div>
<script>
    new Vue({
        data:{
            n:1
        },
        directives:{
            big函数什么时候会被调用?
            1.之领域元素成功绑定时(一上来)。
            2.指令所在的模板背重新解析时
            big(element,binding){
                element.innerText = binding.value
            }
    }
})
</script>
自定义指令_对象式
<div>
    <h1 v-bin = 'n'>   </h1>
<div>
<script>
    new Vue({
        data:{
            n:1
        },
        //对象
        directives:{
            //三个常用函数
            bind(element,binding){
                <!-- 指令与元素成功绑定时 -->
            },
            inserted(element,binding){
                <!-- 指令所在元素背插入页面时 -->
            },
            updated(element,binding){
                <!-- 指令所在的模板背重新解析时 -->
            }
        }
})
</script>
自定义指令总结

全局调用

Vue.directive('函数名',function(){
    //三个常用函数
    bind(element,binding){
        <!-- 指令与元素成功绑定时 -->
    },
    inserted(element,binding){
        <!-- 指令所在元素背插入页面时 -->
    },
    updated(element,binding){
        <!-- 指令所在的模板背重新解析时 -->
    }
})

生命周期函数

image-20230413213832720

//Vue 完成模板的解析并把初始的真实 DOM 放入页面后(挂载完毕)

Vue 组件化编程

模块与组件、模块化与组件化
模块
  1. 理解:向外提供特定功能的 js 程序,一般就是一个 js 文件
  2. 为什么:js 文件很多很复杂
  3. 作用:复用 js,简写 js 的编程呢个,提高 js 运行效率
组件
  1. 理解:用来实现局部(特定)功能效果的代码集合(html/css/js/image….)
  2. 为什么:一个界面的功能很复杂
  3. 作用:复用编码,简化项目编码,提高运行效率

组件的定义 — 实现应用中局部功能代码和资源的集合

模块化
  1. 当应用中的 js 都以模块来编写的,那么这个应用就是一个模块化的应用
组件化
  1. 当应用中的功能都是多组件的方式来编写的,那么这个应用就是一个组件化的应用
非单文件组件
  1. 一个文件中包含有 n 个组件

三个步骤:
创建组件

const shool = Vue.extend({
    data(){
        return {
            abc : 1
        }
    }
})

注册组件

new.Vue({
    components:{
        shool,
    }
})

使用组件

<div>
    <shool />
</div>

components 组件

全局注册组件
Vue.component(‘组件名’,声明的组件名)

Vue.extend (api/继承)

VueComponent

Vue 实例与组件实例
存在的问题

组件的几个注意点

重要的内置关系
显示原型属性 prototype
隐式原型属性 proto

1.一个重要的内置关系:VueComponent.portotype.__proto === Vue.prototype 2.为什么要有这个关系:让组件实例化对象(Vc)可以访问到 Vue 原型上的属性、方法。

单文件组件
  1. 一个文件中包含一个组件
    .vue 文件的常用写法
<template>
    <!-- 组件的结构 -->
</template>

<script>
    <!-- 组件交互相关的代码(数据、方法等等) -->
</script>

<style>
    <!-- 组件的样式 -->
</style>

es6 模块化 暴露
//分别暴露
export 函数
//统一暴露
export { 函数 }
//默认暴露
export default 函数

App.vue 汇总所有的 vue
封装了 vue 在 App 中引用

<!-- 引用组件 -->
import Sched from './Sched'

export default {
    name: 'App',
    <!-- 对上 -->
    components: {
        Sched
    }
}

main.js

import App from './App.vue'

new Vue({
    el:'#root',
    components:{
        App
    }
})

脚手架

全局安装 npm install -g @vue/cli

配置 npm 淘宝镜像 npm config set registry https://registry.npm.taobao.org
Vue 脚手架隐藏了所有的 webpack 相关配置,如果想查看 webpack 配置,执行vue inspect > output.js

安装

npm install -g @vue/cli
# OR
yarn global add @vue/cli

创建一个项目

vue create my-project
# OR
vue ui

vue 脚手架笔记

Vue2 脚手架文件结构

|—— node_modules
|—— public
| |—— favicon.ico :页签图标
| |—— index.html :主页面
|—— src
| |—— assets :存放静态资源
| | |—— logo.png
| |—— component 存放组件
| | |——helloWord.vue
| |—— App.vue :汇总所有组件
| |—— main.js :入口文件
|—— .gitignore :git 版本管制忽略的配置
|—— babel.config.js :babel 的配置文件
|—— package.json :应用包配置文件
|—— package-lock.josn :包版本控制文件
|—— README.md :应用描述文件
|—— vue.config.js :可选的配置文件

关于不同版本的 Vue
  • vue.js 和 vue.runtime.xxx.js 的区别
    (1):vue.js 是完整版的 Vue,包含:核心功能:模板解析器
    (2):vue..runtime.xxx.js 是运行版的 vue,只包含:核心功能,没有模板解析器
  • 因为 Vue.runtime.xxx.js 没有模板解析器,所以不能使用 template 配置项,需要使用 render 函数接收到 createElement 函数去指定具体内容
vue.config,js 配置文件
使用 vue inspect > output.js 可以查看到 vue 脚手架的默认配置
使用 vue.config.js 可以对脚手架进行个性化定制
render 函数

当你引用一个残缺班的 vue 的时候这个 render 函数就能登场了

使用的方式最原始:

render(createElement){

return createElement(‘h1’,’2131’) //这个 createElement 是创建元素

}

修改默认配置

vue.config.js 是一个可选的配置文件,如果项目的 (和 package.json 同级的) 根目录中存在这个文件,那么它会被 @vue/cli-service 自动加载。你也可以使用 package.json 中的 vue 字段,但是注意这种写法需要你严格遵照 JSON 的格式来写。

这个文件应该导出一个包含了选项的对象:

// vue.config.js

/**
 * @type {import('@vue/cli-service').ProjectOptions}
 */
module.exports = {
  // 选项...
}

或者,你也可以使用 @vue/cli-service 提供的 defineConfig 帮手函数,以获得更好的类型提示:

// vue.config.js
const { defineConfig } = require('@vue/cli-service')

module.exports = defineConfig({
  // 选项
})

lintOnSave:false //关闭语法检查

ref 属性

原生的获取 dom 标签元素是绑定一个 id = “xxx” 获取 document.getmentElemntById(‘xxx’)

vue 中不需要这么复杂了 只需要在标签元素身上添加 ref=”xxx” 然后在 vc 身上找到一个叫$refs的元素即可 this.$refs

1.被用来给元素或者子组件注册引用信息(id的替代者)
2.应用在html标签行获取的是真实DOM元素,应用在组件标签上是组件实例化对象(vc)
3.使用方式:
    打标识:<h1 ref="xxx">.....</h1> 或者组件的 <Hello ref="xxx"><Hello>
    获取: this.$refs.xxx
props 配置

外部传递的数据配置

minxi 混入

复用配置
功能:可以把多个组件公用的配置提取成一个很混入对象
使用方法:
第一步定义混合 例如:
{
data(){…},
methods:{…},

}
第二步使用混入,例如:
(1).全局混入:Vue.mixin(xxx)
(2).局部混入:mixins:[‘xxx’]

插件

是一个对象
功能:用于增强 Vue
本质:包含 install 方法的一个对象,install 的第一个参数是 Vue,第二个以后的参数是插件使用者传递的数据

定义插件:
对象.install = function (Vue,option){
// 1.添加全局过滤器
Vue.filter(…)
// 2. 添加全局指令
Vue.directive(‘bane’,…)
// 3.配置全局混入(合)
Vue.mixin(…)
// 4.添加实例方法
Vue.prototype.$myMethod = function() {…}
Vue.prototype.#myProperty = xxxx
}
使用插件: Vue.use()

本文作者:Veam
本文链接:https://github.com/veam23/lonely0323.github.io/2023/05/07/vue2Pro/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可
×