Vue 过滤器、计算属性、侦听器 图解版 一目了然

文章目录

    • 本篇学习目标
    • 1. vue基础
      • 1.0_vue基础 v-for更新监测
      • 1.1_vue基础_v-for就地更新
      • 1.2_vue基础_虚拟dom
      • 1.3_vue基础_diff算法
        • 情况1: 根元素变了, 删除重建
        • 情况2: 根元素没变, 属性改变, ==元素复用==, 更新属性
      • 1.4_vue基础_diff算法-key
        • 情况3: 根元素没变, 子元素没变, 元素内容改变
          • 无key - 就地更新
          • 有key - 值为索引
          • 有key - 值为id
      • 1.5_阶段小结
      • 1.6_vue基础 动态class
      • 1.7_vue基础-动态style
    • 2. vue过滤器
      • 2.0_vue过滤器-定义使用
      • 2.1_vue过滤器-传参和多过滤器
      • 2.2_案例-品牌管理(时间格式化)
    • 3. vue计算属性
      • 3.0_vue计算属性-computed
      • 3.1_vue计算属性-缓存
      • 3.2_案例-品牌管理(总价和均价)
      • 3.3_vue计算属性-完整写法
      • 3.4_案例-小选影响全选
      • 3.5_案例-全选影响小选
      • 3.6_案例-反选
    • 4. vue侦听器
      • 4.0_vue侦听器-watch
      • 4.1_vue侦听器-深度侦听和立即执行
      • 4.2_案例-品牌管理(数据缓存)
    • 今日总结
    • 面试题
      • 1. Vue 中怎么自定义过滤器
      • 2. Vue中:key作用, 为什么不能用索引
      • 3. 数组更新有的时候v-for不渲染
    • 写在最后

本篇学习目标

  1. 能够了解key作用, 虚拟DOM, diff算法
  2. 能够掌握设置动态样式
  3. 能够掌握过滤器, 计算属性, 侦听器
  4. 能够完成品牌管理案例

1. vue基础

1.0_vue基础 v-for更新监测

目标: 当v-for遍历的目标结构改变, Vue触发v-for的更新

情况1: 数组翻转

情况2: 数组截取

情况3: 更新值

口诀:

数组变更方法, 就会导致v-for更新, 页面更新

数组非变更方法, 返回新数组, 就不会导致v-for更新, 可采用覆盖数组或this.$set()

<template><div><ul><li v-for="(val, index) in arr" :key="index">{{ val }}</li></ul><button @click="revBtn">数组翻转</button><button @click="sliceBtn">截取前3个</button><button @click="updateBtn">更新第一个元素值</button></div>
</template><script>
export default {data(){return {arr: [5, 3, 9, 2, 1]}},methods: {revBtn(){// 1. 数组翻转可以让v-for更新this.arr.reverse()},sliceBtn(){// 2. 数组slice方法不会造成v-for更新// slice不会改变原始数组// this.arr.slice(0, 3)// 解决v-for更新 - 覆盖原始数组let newArr = this.arr.slice(0, 3)this.arr = newArr},updateBtn(){// 3. 更新某个值的时候, v-for是监测不到的// this.arr[0] = 1000;// 解决-this.$set()// 参数1: 更新目标结构// 参数2: 更新位置// 参数3: 更新值this.$set(this.arr, 0, 1000)}}
}
</script><style></style>

这些方法会触发数组改变, v-for会监测到并更新页面

  • push()
  • pop()
  • shift()
  • unshift()
  • splice()
  • sort()
  • reverse()

这些方法不会触发v-for更新

  • slice()
  • filter()
  • concat()

注意: vue不能监测到数组里赋值的动作而更新, 如果需要请使用Vue.set() 或者this.$set(), 或者覆盖整个数组

总结: 改变原数组的方法才能让v-for更新

1.1_vue基础_v-for就地更新

v-for 的默认行为会尝试原地修改元素而不是移动它们。

详解v-for就地更新流程(可以看ppt动画)

在这里插入图片描述

这种 虚拟DOM对比方式, 可以提高性能 - 但是还不够高

1.2_vue基础_虚拟dom

目标: 了解虚拟DOM的概念

.vue文件中的template里写的标签, 都是模板, 都要被vue处理成虚拟DOM对象, 才会渲染显示到真实DOM页面上

  1. 内存中生成一样的虚拟DOM结构(本质是个JS对象)

    因为真实的DOM属性好几百个, 没办法快速的知道哪个属性改变了

    比如template里标签结构

    <template><div id="box"><p class="my_p">123</p></div>
    </template>
    

    对应的虚拟DOM结构

    const dom = {type: 'div',attributes: [{id: 'box'}],children: {type: 'p',attributes: [{class: 'my_p'}],text: '123'}
    }
    
  2. 以后vue数据更新

    • 生成新的虚拟DOM结构
    • 和旧的虚拟DOM结构对比
    • 利用diff算法, 找不不同, 只更新变化的部分(重绘/回流)到页面 - 也叫打补丁

好处1: 提高了更新DOM的性能(不用把页面全删除重新渲染)

好处2: 虚拟DOM只包含必要的属性(没有真实DOM上百个属性)

总结: 虚拟DOM保存在内存中, 只记录dom关键信息, 配合diff算法提高DOM更新的性能

在内存中比较差异, 然后给真实DOM打补丁更新上
在这里插入图片描述

1.3_vue基础_diff算法

vue用diff算法, 新虚拟dom, 和旧的虚拟dom比较

情况1: 根元素变了, 删除重建

旧虚拟DOM

<div id="box"><p class="my_p">123</p>
</div>

新虚拟DOM

<ul id="box"><li class="my_p">123</li>
</ul>

情况2: 根元素没变, 属性改变, 元素复用, 更新属性

旧虚拟DOM

<div id="box"><p class="my_p">123</p>
</div>

新虚拟DOM

<div id="myBox" title="标题"><p class="my_p">123</p>
</div>

1.4_vue基础_diff算法-key

情况3: 根元素没变, 子元素没变, 元素内容改变

无key - 就地更新

v-for不会移动DOM, 而是尝试复用, 就地更新,如果需要v-for移动DOM, 你需要用特殊 attribute key 来提供一个排序提示

<ul id="myUL"><li v-for="str in arr">{{ str }} <input type="text"></li>
</ul>
<button @click="addFn">下标为1的位置新增一个</button>
export default {data(){return {arr: ["老大", "新来的", "老二", "老三"]}},methods: {addFn(){this.arr.splice(1, 0, '新来的')}}
};

在这里插入图片描述

旧 - 虚拟DOM结构 和 新 - 虚拟DOM结构 对比过程

在这里插入图片描述

性能不高, 从第二个li往后都更新了

有key - 值为索引
  • 还是就地更新

因为新旧虚拟DOM对比, key存在就复用此标签更新内容, 如果不存在就直接建立一个新的

<ul id="myUL"><li v-for="(str, index) in arr" :key="index">{{ str }} <input type="text"></li>
</ul>
<button @click="addFn">下标为1的位置新增一个</button>
export default {data(){return {arr: ["老大", "新来的", "老二", "老三"]}},methods: {addFn(){this.arr.splice(1, 0, '新来的')}}
};

key为索引-图解过程 (又就地往后更新了)

在这里插入图片描述

在这里插入图片描述

  1. v-for先循环产生新的DOM结构, key是连续的, 和数据对应

  2. 然后比较新旧DOM结构, 找到区别, 打补丁到页面上

    最后补一个li, 然后从第二个往后, 都要更新内容

口诀: key的值有id用id, 没id用索引

有key - 值为id

key的值只能是唯一不重复的, 字符串或数值

v-for不会移动DOM, 而是尝试复用, 就地更新,如果需要v-for移动DOM, 你需要用特殊 attribute key 来提供一个排序提示

新DOM里数据的key存在, 去旧的虚拟DOM结构里找到key标记的标签, 复用标签

新DOM里数据的key存在, 去旧的虚拟DOM结构里没有找到key标签的标签, 创建

旧DOM结构的key, 在新的DOM结构里没有了, 则移除key所在的标签

<template><div><ul><li v-for="obj in arr" :key="obj.id">{{ obj.name }}<input type="text"></li></ul><button @click="btn">下标1位置插入新来的</button></div>
</template><script>
export default {data() {return {arr: [{name: '老大',id: 50},{name: '老二',id: 31},{name: '老三',id: 10}],};},methods: {btn(){this.arr.splice(1, 0, {id: 19, name: '新来的'})}}
};
</script><style>
</style>

图解效果:

在这里插入图片描述

在这里插入图片描述

总结: 不用key也不影响功能(就地更新), 添加key可以提高更新的性能

1.5_阶段小结

v-for什么时候会更新页面呢?

  • 数组采用更新方法, 才导致v-for更新页面

vue是如何提高更新性能的?

  • 采用虚拟DOM+diff算法提高更新性能

虚拟DOM是什么?

  • 本质是保存dom关键信息的JS对象

diff算法如何比较新旧虚拟DOM?

  • 根元素改变 – 删除当前DOM树重新建
  • 根元素未变, 属性改变 – 更新属性
  • 根元素未变, 子元素/内容改变
  • 无key – 就地更新 / 有key – 按key比较

1.6_vue基础 动态class

目标: 用v-bind给标签class设置动态的值

  • 语法:
    • :class="{类名: 布尔值}"
<template><div><!-- 语法::class="{类名: 布尔值}"使用场景: vue变量控制标签是否应该有类名--><p :class="{red_str: bool}">动态class</p></div>
</template><script>
export default {data(){return {bool: true}}
}
</script><style scoped>.red_str{color: red;}
</style>

总结: 就是把类名保存在vue变量中赋予给标签

1.7_vue基础-动态style

目标: 给标签动态设置style的值

  • 语法
    • :style="{css属性: 值}"
<template><div><!-- 动态style语法:style="{css属性名: 值}"--><p :style="{backgroundColor: colorStr}">动态style</p></div>
</template><script>
export default {data(){return {colorStr: 'red'}}
}
</script><style></style>

总结: 动态style的key都是css属性名

2. vue过滤器

2.0_vue过滤器-定义使用

目的: 转换格式, 过滤器就是一个函数, 传入值返回处理后的值

过滤器只能用在, 插值表达式和v-bind表达式

Vue中的过滤器场景

  • 字母转大写, 输入"hello", 输出"HELLO"
  • 字符串翻转, “输入hello, world”, 输出"dlrow ,olleh"

语法:

  • Vue.filter(“过滤器名”, (值) => {return “返回处理后的值”})

  • filters: {过滤器名字: (值) => {return “返回处理后的值”}

例子:

  • 全局定义字母都大写的过滤器
  • 局部定义字符串翻转的过滤器
<template><div><p>原来的样子: {{ msg }}</p><!-- 2. 过滤器使用语法: {{ 值 | 过滤器名字 }}--><p>使用翻转过滤器: {{ msg | reverse }}</p><p :title="msg | toUp">鼠标长停</p></div>
</template><script>
export default {data(){return {msg: 'Hello, Vue'}},// 方式2: 局部 - 过滤器// 只能在当前vue文件内使用/*语法: filters: {过滤器名字 (val) {return 处理后的值}}*/filters: {toUp (val) {return val.toUpperCase()}}
}
</script><style></style>

总结: 把值转成另一种形式, 使用过滤器, Vue3用函数替代了过滤器.

全局注册最好在main.js中注册, 一处注册到处使用

2.1_vue过滤器-传参和多过滤器

目标: 可同时使用多个过滤器, 或者给过滤器传参

  • 语法:
    • 过滤器传参: vue变量 | 过滤器(实参)
    • 多个过滤器: vue变量 | 过滤器1 | 过滤器2
<template><div><p>原来的样子: {{ msg }}</p><!-- 1.给过滤器传值语法: vue变量 | 过滤器名(值)--><p>使用翻转过滤器: {{ msg | reverse('|') }}</p><!-- 2.多个过滤利使用语法: vue变量 | 过滤器1 | 过滤器2--><p :title="msg | toUp | reverse('|')">鼠标长停</p></div>
</template><script>
export default {data(){return {msg: 'Hello, Vue'}},filters: {toUp (val) {return val.toUpperCase()}}
}
</script><style></style>

总结: 过滤器可以传参, 还可以对某个过滤器结果, 后面在使用一个过滤器

2.2_案例-品牌管理(时间格式化)

目标: 复制上个案例, 在此基础上, 把表格里的时间用过滤器+moment模块, 格式化成YYYY-MM-DD 格式

图示:

在这里插入图片描述

  1. 下载moment处理日期的第三方工具模块

    moment官网文档: http://momentjs.cn/docs/#/displaying/

    yarn add moment
    
  2. 定义过滤器, 把时间用moment模块格式化, 返回我们想要的格式

    // 目标: 处理时间
    // 1. 下载moment模块
    import moment from 'moment'// 2. 定义过滤器, 编写内部代码
    filters: { formatDate (val){return moment(val).format('YYYY-MM-DD')}
    }<!-- 3. 使用过滤器 -->
    <td>{{ obj.time | formatDate }}</td>
    

3. vue计算属性

3.0_vue计算属性-computed

目标: 一个数据, 依赖另外一些数据计算而来的结果

语法:

  • computed: {"计算属性名" () {return "值"}
    }
    

需求:

  • 需求: 求2个数的和显示到页面上
<template><div><p>{{ num }}</p></div>
</template><script>
export default {data(){return {a: 10,b: 20}},// 计算属性:// 场景: 一个变量的值, 需要用另外变量计算而得来/*语法:computed: {计算属性名 () {return 值}}*/// 注意: 计算属性和data属性都是变量-不能重名// 注意2: 函数内变量变化, 会自动重新计算结果返回computed: {num(){return this.a + this.b}}
}
</script><style></style>

注意: 计算属性也是vue数据变量, 所以不要和data里重名, 用法和data相同

总结: 一个数据, 依赖另外一些数据计算而来的结果

3.1_vue计算属性-缓存

目标: 计算属性是基于它们的依赖项的值结果进行缓存的,只要依赖的变量不变, 都直接从缓存取结果
在这里插入图片描述

<template><div><p>{{ reverseMessage }}</p><p>{{ reverseMessage }}</p><p>{{ reverseMessage }}</p><p>{{ getMessage() }}</p><p>{{ getMessage() }}</p><p>{{ getMessage() }}</p></div>
</template><script>
export default {data(){return {msg: "Hello, Vue"}},// 计算属性优势:// 带缓存// 计算属性对应函数执行后, 会把return值缓存起来// 依赖项不变, 多次调用都是从缓存取值// 依赖项值-变化, 函数会"自动"重新执行-并缓存新的值computed: {reverseMessage(){console.log("计算属性执行了");return this.msg.split("").reverse().join("")}},methods: {getMessage(){console.log("函数执行了");return this.msg.split("").reverse().join("")}}
}
</script><style></style>

总结: 计算属性根据依赖变量结果缓存, 依赖变化重新计算结果存入缓存, 比普通方法性能更高

3.2_案例-品牌管理(总价和均价)

目标: 基于之前的案例, 完成总价和均价的计算效果
在这里插入图片描述

此处只修改了变化的代码

<tr style="background-color: #EEE"><td>统计:</td><td colspan="2">总价钱为: {{ allPrice }}</td><td colspan="2">平均价: {{ svgPrice }}</td>
</tr><script>
// 目标: 总价和均价显示
// 1. 末尾补tr - 显示总价和均价
export default {// ...源代码省略// 2. 计算属性computed: {allPrice(){// 3. 求总价return this.list.reduce((sum, obj) => sum += obj.price, 0)},avgPrice(){// 4. 求均价 - 保留2位小数return (this.allPrice / this.list.length).toFixed(2)}}
}
</script>

总结: 总价来源于所有数据计算而来的结果, 故采用计算属性

3.3_vue计算属性-完整写法

目标: 计算属性也是变量, 如果想要直接赋值, 需要使用完整写法

语法:

computed: {"属性名": {set(){},get() {return "值"}}
}

需求:

  • 计算属性给v-model使用

页面准备输入框

<template><div><div><span>姓名:</span><input type="text" v-model="full"></div></div>
</template><script>
// 问题: 给计算属性赋值 - 需要setter
// 解决:
/*完整语法:computed: {"计算属性名" (){},"计算属性名": {set(值){},get(){return 值}}}
*/
export default {computed: {full: {// 给full赋值触发set方法set(val){console.log(val)},// 使用full的值触发get方法get(){return "无名氏"}}}
}
</script><style></style>

总结: 想要给计算属性赋值, 需要使用set方法

3.4_案例-小选影响全选

目标: 小选框都选中(手选), 全选自动选中

  • 需求: 小选框都选中(手选), 全选自动选中

分析:

① 先静态后动态, 从.md拿到静态标签和数据

② 循环生成复选框和文字, 对象的c属性和小选框的选中状态, 用v-model双向绑定

③ 定义isAll计算属性, 值通过小选框们统计c属性状态得来

图示:
在这里插入图片描述

模板标签和数据(直接复制在这基础上写vue代码)

<template><div><span>全选:</span><input type="checkbox"/><button>反选</button><ul><li><input type="checkbox"/><span>任务名</span></li></ul></div>
</template><script>
export default {data() {return {arr: [{name: "猪八戒",c: false,},{name: "孙悟空",c: false,},{name: "唐僧",c: false,},{name: "白龙马",c: false,},],};}
};
</script>

正确代码,不可复制

<template><div><span>全选:</span><!-- 4. v-model 关联全选 - 选中状态 --><input type="checkbox" v-model="isAll"/><button>反选</button><ul><li v-for="(obj, index) in arr" :key="index"><!-- 3. 对象.c - 关联 选中状态 --><input type="checkbox" v-model="obj.c"/><span>{{ obj.name }}</span></li></ul></div>
</template><script>
// 目标: 小选框 -> 全选
// 1. 标签+样式+js准备好
// 2. 把数据循环展示到页面上
export default {data() {return {arr: [{name: "猪八戒",c: false,},{name: "孙悟空",c: false,},{name: "唐僧",c: false,},{name: "白龙马",c: false,},],};},// 5. 计算属性-isAllcomputed: {isAll () {// 6. 统计小选框状态 ->  全选状态// every口诀: 查找数组里"不符合"条件, 直接原地返回falsereturn this.arr.every(obj => obj.c === true)}}
};
</script>

3.5_案例-全选影响小选

目标: 全选影响小选

  • 需求1: 获取到全选状态 – 改装isAll计算属性
  • 需求2: 全选状态同步给所有小选框

分析:

①: isAll改成完整写法, set里获取到全选框, 勾选的状态值

②: 遍历数据数组, 赋给所有小选框v-model关联的属性

图示:

在这里插入图片描述

正确代码,不可以复制

<script>
export default {// ...其他代码// 5. 计算属性-isAllcomputed: {isAll: {set(val){// 7. 全选框 - 选中状态(true/false)this.arr.forEach(obj => obj.c = val)},get(){// 6. 统计小选框状态 ->  全选状态// every口诀: 查找数组里"不符合"条件, 直接原地返回falsereturn this.arr.every(obj => obj.c === true)}}}
};
</script>

3.6_案例-反选

目标: 反选功能

  • 需求: 点击反选, 让所有小选框, 各自取相反勾选状态

分析:

①: 小选框的勾选状态, 在对象的c属性

②: 遍历所有对象, 把对象的c属性取相反值赋予回去即可

图示:
在这里插入图片描述

正确代码,不可以复制


<button @click="btn">反选</button><script>
export default {// ...其他代码省略methods: {btn(){// 8. 让数组里对象的c属性取反再赋予回去this.arr.forEach(obj => obj.c = !obj.c)}}
};
</script>

4. vue侦听器

4.0_vue侦听器-watch

目标: 可以侦听data/computed属性值改变

语法:

  • watch: {"被侦听的属性名" (newVal, oldVal){}
    }
    

完整例子代码:

<template><div><input type="text" v-model="name"></div>
</template><script>
export default {data(){return {name: ""}},// 目标: 侦听到name值的改变/*语法:watch: {变量名 (newVal, oldVal){// 变量名对应值改变这里自动触发}}*/watch: {// newVal: 当前最新值// oldVal: 上一刻值name(newVal, oldVal){console.log(newVal, oldVal);}}
}
</script><style></style>

总结: 想要侦听一个属性变化, 可使用侦听属性watch

4.1_vue侦听器-深度侦听和立即执行

目标: 侦听复杂类型, 或者立即执行侦听函数

  • 语法:

    watch: {"要侦听的属性名": {immediate: true, // 立即执行deep: true, // 深度侦听复杂类型内变化handler (newVal, oldVal) {}}
    }
    

完整例子代码:

<template><div><input type="text" v-model="user.name"><input type="text" v-model="user.age"></div>
</template><script>
export default {data(){return {user: {name: "",age: 0}}},// 目标: 侦听对象/*语法:watch: {变量名 (newVal, oldVal){// 变量名对应值改变这里自动触发},变量名: {handler(newVal, oldVal){},deep: true, // 深度侦听(对象里面层的值改变)immediate: true // 立即侦听(网页打开handler执行一次)}}*/watch: {user: {handler(newVal, oldVal){// user里的对象console.log(newVal, oldVal);},deep: true,immediate: true}}
}
</script><style></style>

总结: immediate立即侦听, deep深度侦听, handler固定方法触发

4.2_案例-品牌管理(数据缓存)

目标: 侦听list变化, 同步到浏览器本地

  • 需求: 把品牌管理的数据实时同步到本地缓存

分析:

​ ① 在watch侦听list变化的时候, 把最新的数组list转成JSON字符串存入到localStorage本地

​ ② data里默认把list变量从本地取值, 如果取不到给个默认的空数组

效果:

​ 新增/删除 – 刷新页面 – 数据还在

在之前的案例代码基础上接着写

正确代码,不可复制

<script>
import moment from "moment";
export default {data() {return {name: "", // 名称price: 0, // 价格// 3. 本地取出缓存listlist: JSON.parse(localStorage.getItem('pList')) || [],};},// ...其他代码省略watch: {list: {handler(){// 2. 存入本地localStorage.setItem('pList', JSON.stringify(this.list))},deep: true}}
};
</script>

今日总结

  • v-for能监测到哪些数组方法变化, 更新页面
  • key的作用是什么
  • 虚拟dom好处, diff算法效果
  • 动态设置class或style
  • vue过滤器作用和分类
  • vue计算属性作用
  • vue侦听器的作用

面试题

1. Vue 中怎么自定义过滤器

​ Vue.js允许自定义过滤器,可被用于一些常见的文本格式化。过滤器可以用在两个地方:双花括号插值和v-bind表达式

​ 全局的用Vue.filter()

​ 局部的用filters属性

2. Vue中:key作用, 为什么不能用索引

​ :key是给v-for循环生成标签颁发唯一标识的, 用于性能的优化

​ 因为v-for数据项的顺序改变,Vue 也不会移动 DOM 元素来匹配数据项的顺序,而是就地更新每个元素

​ :key如果是索引, 因为索引是连续的, 如果删除其中某一个, 会导致最后一个被删除

​ 当我们再删除的时候, :key再根据数据来把新旧的dom对比时, 删除:key不存在的对应的标签(添加也是一样的插入到指定位置, 别的都不会动)

3. 数组更新有的时候v-for不渲染

​ 因为vue内部只能监测到数组顺序/位置的改变/数量的改变, 但是值被重新赋予监测不到变更, 可以用 Vue.set() / vm.$set()

写在最后

原创不易,还希望各位大佬支持一下\textcolor{blue}{原创不易,还希望各位大佬支持一下}

👍 点赞,你的认可是我创作的动力!\textcolor{green}{点赞,你的认可是我创作的动力!}

⭐️ 收藏,你的青睐是我努力的方向!\textcolor{green}{收藏,你的青睐是我努力的方向!}

✏️ 评论,你的意见是我进步的财富!\textcolor{green}{评论,你的意见是我进步的财富!}

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

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

相关文章

Vue自定义指令原来这么简单

本篇学习目标 能够了解组件进阶知识能够掌握自定义指令创建和使用能够完成tabbar案例的开发 1. 组件进阶 1.0 组件进阶 - 动态组件 目标: 多个组件使用同一个挂载点&#xff0c;并动态切换&#xff0c;这就是动态组件 需求: 完成一个注册功能页面, 2个按钮切换, 一个填写注册…

那些被人忽略的Vue导航知识

本篇学习目标 能够了解单页面应用概念和优缺点能够掌握vue-router路由系统使用能够掌握链接导航和编程式导航用法能够掌握路由嵌套和路由守卫能够掌握vant组件库基础使用 1. vue路由简介和基础使用 1.0 什么是路由 目标: 设备和ip的映射关系 目标: 接口和服务的映射关系 目…

passwd命令

-n 在这几天你不能更改密码&#xff01; -x 在n<时间<x在这段时间内你必须修改密码&#xff01; -w 当距离x日期还有w天的时候开始提醒你改密码&#xff01; -i 密码过期i天之后&#xff0c;此密码停用&#xff0c;你也就无法用此密码登陆这个用户了。注意是密码过期之后…

一文带你吃透Vue生命周期(结合案例通俗易懂)

文章目录本篇学习目标1. vue生命周期1.0_人的-生命周期1.1_钩子函数1.2_初始化阶段1.3_挂载阶段1.4_更新阶段1.5_销毁阶段2. axios2.0_axios基本使用2.1_axios基本使用-获取数据2.2_axios基本使用-传参2.3_axios基本使用-发布书籍2.4_axios基本使用-全局配置3. nextTick和nextT…

[SCOI2012]滑雪 (最小生成树 Kruskal)

题目描述 a180285非常喜欢滑雪。他来到一座雪山&#xff0c;这里分布着M条供滑行的轨道和N个轨道之间的交点&#xff08;同时也是景点&#xff09;&#xff0c;而且每个景点都有一编号i(1≤i≤N)和一高度Hi​。a180285能从景点ii滑到景点j当且仅当存在一条i和j之间的边&#xf…

灵活的Vue组件——原来这么简单

本篇学习目标 能够理解vue组件概念和作用能够掌握封装组件能力能够使用组件之间通信能够完成todo案例 1. vue组件 1.0_为什么用组件 以前做过一个折叠面板 需求: 现在想要多个收起展开的部分 方案1: 复制代码 代码重复 冗余不利于维护 案例用less写的样式, 所以下载 ya…

赢在CSDN——名利兼收

文章目录&#x1f30a; 相识CSDN&#x1f30a; 益于CSDN流量将成为你我的亮点我的专栏收益到账啦学习会员助你拿捏专栏更多曝光自己的机会CSDN问答为你准备的零花钱&#x1f30a; 忠于CSDN&#x1f30a; 相识CSDN 小编自注册CSDN至今两年有余&#xff0c;记得初衷也仅仅是为了…

了解 Vue SSR 这一篇足以

文章目录1 - 什么是服务器端渲染&#xff1f;1.1 新建server文件夹1.2 生成一个node项目1.3 安装express1.4 服务端渲染小案例1.5 运行查看效果1.6 打开浏览器1.7 右键查看源代码2 - 什么是客户端渲染&#xff1f;2.1 新建client文件夹2.2 生成一个vue项目2.3 安装依赖并启动2.…

小型软件项目开发流程探讨

一&#xff0e;导言国内很多项目都是小型项目, 参与人员少(两到五个人), 要快速交付(一两个月) . 要成功完成这种项目, 除了使用成熟且被团队成员熟练使用的技术之外, 有一个良好的开发流程, 也是很必要的. 二&#xff0e;小型软件项目开发流程下图是我对小型软件项目开发流程…

sanic官方文档解析之下载和Configuration

1,sanic框架是做什么的? sanic的官方网址:https://sanic.readthedocs.io/en/latest/sanic框架是一个类似于flask框架的在Python3.5以上版本的文本服务器,他能够快速的编写,它是通过惊人的开发效率完成开发,希望通过这篇文章得到激励sanic框架的理念是:简单,高效 sanic的应用如…

首秀 Express 框架

文章目录框架特性express的使用初始化项目&#xff1a;下载框架模块&#xff1a;测试代码&#xff1a;总结以上代码&#xff1a;请求处理的中间件概念&#xff1a;中间件——app.use基本用法&#xff1a;next的用法app.use中间件的应用路由的保护网站维护公告自定义404&#xf…

云原生技能树测评

前言 利用午休后的10多分钟时间&#xff0c;看了看APP的技能树板块&#xff0c;简单的提出几个看法&#xff01; 答题过程 可以设置为闯关类型&#xff0c;答对一道后可以进入下一关&#xff0c;或者是一个章节为一关&#xff0c;让大家一直有一种期待 回答错误数量 可以…

原型和闭包

原型和闭包 一切皆对象 一切皆对象&#xff08;类型值除外&#xff09; undefined, number, string, boolean属于简单的值类型 函数、数组、对象、new Number(10)都是对象。他们都是引用类型 Null是基本数据类型&#xff0c;不是引用数据类型 基本数据类型的值就是它本身的值&a…

一文教会你何为重绘、回流?

文章目录css图层图层创建的条件重绘(Repaint)回流触发重绘的属性触发回流的属性常见的触发回流的操作优化方案requestAnimationFrame----请求动画帧写在最后学习目标&#xff1a; 了解前端Dom代码、css样式、js逻辑代码到浏览器展现过程了解什么是图层了解重绘与回流了解前端层…

js函数、js对象的这些点你真的懂吗?

本篇学习目标 ✨了解函数&#xff08;高级&#xff09;原型原型链概念\textcolor{green}{了解函数&#xff08;高级&#xff09;原型原型链概念}了解函数&#xff08;高级&#xff09;原型原型链概念 ✨掌握函数作用域\textcolor{green}{掌握函数作用域}掌握函数作用域 ✨掌握…

前端处理跨域的几种方式

什么是跨域&#xff1f; 跨域是指一个域下的文档或脚本试图去请求另一个域下的资源&#xff0c;这里跨域是广义的。 广义的跨域&#xff1a; 1、资源跳转&#xff1a;A链接、重定向、表单提交 2、资源嵌入&#xff1a; <link>、<script>、<img>、<frame&g…

程序员必知的缓存套图

文章目录1. 线程与进程1.1 进程:1.2. 线程:1.3. 关系2. 浏览器内核模块组成4. 事件循环机制5. 缓存5.1. 缓存理解5.2. 缓存分类5.3. 缓存使用示意图5.4. 缓存中的header参数1. 线程与进程 1.1 进程: 进程是计算机中的程序关于某数据集合上的一次运行活动&#xff0c;是系统进…

安装webpack及使用

前言 你是否也是只会运用框架中集成好的Webpack配置呢&#xff1f;你明白每一项的意义么&#xff1f;你懂多少Webpack的个性化配置项呢&#xff1f;本篇文章为你讲解Webpack中的各种配置项参数及作用&#xff01; 文章目录了解Webpack相关开启项目编译打包应用使用webpack配置…

php单例型(singleton pattern)

搞定&#xff0c;吃饭 <?php /* The purpose of singleton pattern is to restrict instantiation of class to a single object. It is implemented by creating a method within the class that creates a new instance of that class if one does not exist. If an obje…

助你提高效率的几个Vue指令

前言 很多使用Vue的同学往往最容易忽略的指令&#xff0c;由于在这里考虑到很多初学甚至还没有开始接触Vue的同学呢&#xff0c;在介绍v-clos之前呢就先以大家都熟知的v-model编写小demo v-model 相信大家对v-model并不陌生&#xff0c;简单来讲他就是用于在表单控件以及组建…