Vue3技术2之ref函数、reactive函数、Vue3中的响应式原理

news2024/9/21 17:08:37

Vue3技术2

  • ref函数
    • 处理基本类型
      • App.vue
    • 处理对象类型
      • App.vue
    • 总结:ref函数
  • reactive函数
    • 只能修改对象类型
      • App.vue
    • 完善代码
      • App.vue
    • 总结:reactive函数
  • Vue3.0中的响应式原理
    • 回顾Vue2的响应式原理
    • Vue3响应式原理
      • 模拟Vue2中实现响应式
        • index.html
      • 模拟Vue3中实现响应式—Proxy
        • index.html
      • 模拟Vue3中实现响应式—Reflect
        • 通过Reflect.defineProperty去操作
          • index.html
        • 通过Object.defineProperty去操作
          • index.html
        • 使用Reflect改善Vue3的响应式
    • 总结
      • vue2.x的响应式
      • vue3的响应式
      • reactive对比ref

ref函数

处理基本类型

App.vue

<template>
  <h1>一个人的信息</h1>
  <h2>姓名:{{name}}</h2>
  <h2>年龄:{{age}}</h2>
  <button @click="changeInfo">修改人的信息</button>
</template>

<script>
import {ref} from 'vue'
export default {
  name: 'App',
  setup(){
    //数据
    let name=ref('张三')
    let age=ref(18)

    function changeInfo(){
      console.log("name,age",name,age)
      name.value='李四'
      age.value=20
      console.log(name,age)
    }

    //返回一个对象(常用)
    return{
      name,
      age,
      changeInfo
    }
  }
}
</script>

请添加图片描述

处理对象类型

App.vue

<template>
  <h1>一个人的信息</h1>
  <h2>姓名:{{name}}</h2>
  <h2>年龄:{{age}}</h2>
  <h2>工作:{{job.type}}</h2>
  <h2>薪资:{{job.salary}}</h2>
  <button @click="changeInfo">修改人的信息</button>
  <button @click="changeObject">修改职位信息</button>
</template>

<script>
import {ref} from 'vue'
export default {
  name: 'App',
  setup(){
    //数据
    let name=ref('张三')
    let age=ref(18)
    let job=ref({
      type:'前端工程师',
      salary:'10k'
    })

    function changeInfo(){
      name.value='李四'
      age.value=20
      console.log("name",name)
    }

    function changeObject(){
      console.log("job",job.value)
      job.value.type='蓝翔技术工'
      job.value.salary='50k'
    }

    //返回一个对象(常用)
    return{
      name,
      age,
      job,
      changeInfo,
      changeObject
    }
  }
}
</script>



请添加图片描述
在这里插入图片描述

总结:ref函数

  1. 作用:定义一个响应式的数据
  2. 语法:const xxx=ref(initValue)
    (1)创建一个包含响应式数据的引用对象(reference对象,简称ref对象)
    (2)JS中操作数据: xxx.value
    (3)模板中读取数据:不需要.value,直接:<div>{{xxx}}</div>
  3. 备注:
    (1)接收的数据可以是:基本类型、也可以是对象类型
    (2)基本类型的数据:响应式依然是靠Object.defineProperty()getset完成的
    (3)对象类型的数据:内部 “求助” 了Vue3.0中的一个新函数——reactive函数

reactive函数

只能修改对象类型

App.vue

<template>
  <h1>一个人的信息</h1>
  <h2>姓名:{{name}}</h2>
  <h2>年龄:{{age}}</h2>
  <h2>工作:{{job.type}}</h2>
  <h2>薪资:{{job.salary}}</h2>
  <h2>测试c:{{job.a.b.c}}</h2>
  <h2>爱好:{{hobby}}</h2>
  <button @click="changeInfo">修改人的信息</button>
  <button @click="changeObject">修改职位信息</button>
  <button @click="changeHobby">修改第一个爱好</button>
</template>

<script>
import {ref,reactive} from 'vue'
export default {
  name: 'App',
  setup(){
    //数据
    let name=ref('张三')
    let age=ref(18)
    let job=reactive({
      type:'前端工程师',
      salary:'10k',
      a:{
        b:{
          c:1
        }
      }
    })
    let hobby=reactive(['吃饭','睡觉','打游戏'])

    function changeInfo(){
      name.value='李四'
      age.value=20
      console.log("name",name)
    }

    function changeObject(){
      console.log("job",job)
      job.type="蓝翔技术工"
      job.salary="20k"
      job.a.b.c=666
    }

    function changeHobby(){
      hobby[0]="唱歌"
    }


    //返回一个对象(常用)
    return{
      name,
      age,
      job,
      hobby,
      changeInfo,
      changeObject,
      changeHobby
    }
  }
}
</script>

请添加图片描述

完善代码

App.vue

<template>
  <h1>一个人的信息</h1>
  <h2>姓名:{{person.name}}</h2>
  <h2>年龄:{{person.age}}</h2>
  <h2>工作:{{person.job.type}}</h2>
  <h2>薪资:{{person.job.salary}}</h2>
  <h2>测试c:{{person.job.a.b.c}}</h2>
  <h2>爱好:{{person.job.hobby}}</h2>
  <button @click="changePerson">修改人的信息</button>
</template>

<script>
import {reactive} from 'vue'
export default {
  name: 'App',
  setup(){
    //数据
    let person=reactive({
      name:"张三",
      age:18,
      job:{
        type:'前端工程师',
        salary:'10k',
        a:{
          b:{
            c:1
          }
        },
        hobby:['吃饭','唱歌','看电影']
      }

    })

    function changePerson(){
      person.name="李四"
      person.age=25
      person.job.type='UI设计师'
      person.job.salary='60k'
      person.job.a.b.c=666
      person.job.hobby[0]="跳舞"
    }


    //返回一个对象(常用)
    return{
      person,
      changePerson
    }
  }
}
</script>

请添加图片描述

总结:reactive函数

  1. 作用:定义一个对象类型的响应式数据(基本类型不要用它,要用ref函数)
  2. 语法:const 代理对象=reactive(源对象)接收一个对象(数组),返回一个代理对象(Proxy的实例对象,简称proxy对象)
  3. reactive定义的响应式数据是“深层次的”
  4. 内部基于ES6的Proxy实现,通过代理对象操作源对象内部数据进行操作

Vue3.0中的响应式原理

回顾Vue2的响应式原理

  1. 新增数据、删除数据、直接通过下标修改数组,界面不会自动更新,但是数据确实被修改了
  • App.vue
<template>
  <div class="bg">
    <h1>我是Vue2写的效果</h1>
    <h2 v-show="person.name">姓名:{{person.name}}</h2>
    <h2>年龄:{{person.age}}</h2>
    <h2 v-show="person.sex">性别:{{person.sex}}</h2>
    <h2>爱好:{{person.hobby}}</h2>
    <button @click="addSex">新增一个sex属性</button>
    <button @click="deleteName">删除一个name属性</button>
    <button @click="changeHobby">修改第一个爱好</button>
  </div>

</template>

<script>
export default {
  name: "App",
  data(){
    return{
      person:{
        name:"张三",
        age:25,
        hobby:["学习","读书","看报"]
      }
    }
  },
  methods:{
    addSex(){
      console.log(this.person.sex)
      this.person.sex="女"
      console.log(this.person.sex)
      console.log("---------------------")
    },
    deleteName(){
      console.log(this.person.name)
      delete this.person.name
      console.log(this.person.name)
      console.log("---------------------")
    },
    changeHobby(){
      console.log(this.person.hobby)
      this.person.hobby[0]="唱歌"
      console.log(this.person.hobby)
      console.log("---------------------")

    }
  }
}
</script>

<style>
</style>

请添加图片描述

  1. 必须使用set方法或者数组原始方法修改,界面才会有响应
  • App.vue
<template>
  <div class="bg">
    <h1>我是Vue2写的效果</h1>
    <h2 v-show="person.name">姓名:{{person.name}}</h2>
    <h2>年龄:{{person.age}}</h2>
    <h2 v-show="person.sex">性别:{{person.sex}}</h2>
    <h2>爱好:{{person.hobby}}</h2>
    <button @click="addSex">新增一个sex属性</button>
    <button @click="deleteName">删除一个name属性</button>
    <button @click="changeHobby">修改第一个爱好</button>
  </div>

</template>

<script>
import Vue from 'vue'
export default {
  name: "App",
  data(){
    return{
      person:{
        name:"张三",
        age:25,
        hobby:["学习","读书","看报"]
      }
    }
  },
  methods:{
    addSex(){
      /*console.log(this.person.sex)
      this.person.sex="女"
      console.log(this.person.sex)
      console.log("---------------------")*/
      //界面有响应的
      this.$set(this.person,'sex','女')
      // Vue.set(this.person,'sex','女')
    },
    deleteName(){
      /*console.log(this.person.name)
      delete this.person.name
      console.log(this.person.name)
      console.log("---------------------")*/
      //界面有响应的
      this.$delete(this.person,'name')
      // Vue.delete(this.person,'name')
    },
    changeHobby(){
      /*console.log(this.person.hobby)
      this.person.hobby[0]="唱歌"
      console.log(this.person.hobby)
      console.log("---------------------")*/
      //界面有响应的
      // this.$set(this.person.hobby,0,'唱歌')
      this.person.hobby.splice(0,1,'唱歌')
    }
  }
}
</script>

<style>
</style>



请添加图片描述

Vue3响应式原理

模拟Vue2中实现响应式

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Vue3的响应式原理</title>
</head>
<body>
<script>
    let person={
        name:"张三",
        age:18
    }

    //模拟Vue2中实现响应式
    let p={}
    Object.defineProperty(p,'name',{
        configurable:true,  //可配置的,可以删除属性
        get(){  //有人读取name时调用
            return person.name
        },
        set(value){   //有人修改name时调用
            console.log("有人修改了name属性,我发现了,我要去更新界面!")
            person.name=value
        }
    })
    Object.defineProperty(p,'age',{
        get(){  //有人读取age时调用
            return person.age
        },
        set(value){   //有人修改name时调用
            console.log("有人修改了age属性,我发现了,我要去更新界面!")
            person.age=value
        }
    })
</script>
</body>
</html>

请添加图片描述

添加与删除一个属性都捕获不到

模拟Vue3中实现响应式—Proxy

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Vue3的响应式原理</title>
</head>
<body>
<script>
    let person={
        name:"张三",
        age:18
    }

    //模拟Vue2中实现响应式
   // #region   解决vsCode中折叠后但又打开的情况
   /* let p={}
    Object.defineProperty(p,'name',{
        configurable:true,  //可配置的,可以删除属性
        get(){  //有人读取name时调用
            return person.name
        },
        set(value){   //有人修改name时调用
            console.log("有人修改了name属性,我发现了,我要去更新界面!")
            person.name=value
        }
    })
    Object.defineProperty(p,'age',{
        get(){  //有人读取age时调用
            return person.age
        },
        set(value){   //有人修改name时调用
            console.log("有人修改了age属性,我发现了,我要去更新界面!")
            person.age=value
        }
    })*/
    // #endregion

    //模拟Vue3中实现响应式
    const p=new Proxy(person,{
        //有人读取p的某个属性时调用
        get(target,propName){
            console.log(`有人读取了p身上的${propName}属性`)
            return target[propName]
        },
        //有人修改p的某个属性、或给p追加某个属性时调用
        set(target,propName,value){
            console.log(`有人修改了p身上的${propName}属性,我要去更新界面了`)
            return target[propName]=value
        },
        //有人删除p的某个属性时调用
        deleteProperty(target, propName) {
            console.log(`有人删除了p身上的${propName}属性,我要去更新界面了`)
            return delete target[propName]
        }
    })




</script>
</body>
</html>

请添加图片描述

模拟Vue3中实现响应式—Reflect

通过Reflect.defineProperty去操作

index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Vue3的响应式原理</title>
</head>
<body>
<script>
    let person={
        name:"张三",
        age:18
    }

    //模拟Vue2中实现响应式
   // #region   解决vsCode中折叠后但又打开的情况
   /* let p={}
    Object.defineProperty(p,'name',{
        configurable:true,  //可配置的,可以删除属性
        get(){  //有人读取name时调用
            return person.name
        },
        set(value){   //有人修改name时调用
            console.log("有人修改了name属性,我发现了,我要去更新界面!")
            person.name=value
        }
    })
    Object.defineProperty(p,'age',{
        get(){  //有人读取age时调用
            return person.age
        },
        set(value){   //有人修改name时调用
            console.log("有人修改了age属性,我发现了,我要去更新界面!")
            person.age=value
        }
    })*/
    // #endregion

    //模拟Vue3中实现响应式
    /*const p=new Proxy(person,{
        //有人读取p的某个属性时调用
        get(target,propName){
            console.log(`有人读取了p身上的${propName}属性`)
            return target[propName]
        },
        //有人修改p的某个属性、或给p追加某个属性时调用
        set(target,propName,value){
            console.log(`有人修改了p身上的${propName}属性,我要去更新界面了`)
            return target[propName]=value
        },
        //有人删除p的某个属性时调用
        deleteProperty(target, propName) {
            console.log(`有人删除了p身上的${propName}属性,我要去更新界面了`)
            return delete target[propName]
        }
    })*/


    obj={a:1,b:2}
    //通过Reflect.defineProperty去操作
    const x1=Reflect.defineProperty(obj,'c',{
        get(){
            return 3
        }
    })
    const x2=Reflect.defineProperty(obj,'c',{
        get(){
            return 100
        }
    })
    if(x2){
        console.log("某某某操作成功了!")
    }else{
        console.log("某某某操作失败了!")
    }



</script>
</body>
</html>

在这里插入图片描述

通过Object.defineProperty去操作

index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Vue3的响应式原理</title>
</head>
<body>
<script>
    let person={
        name:"张三",
        age:18
    }

    //模拟Vue2中实现响应式
   // #region   解决vsCode中折叠后但又打开的情况
   /* let p={}
    Object.defineProperty(p,'name',{
        configurable:true,  //可配置的,可以删除属性
        get(){  //有人读取name时调用
            return person.name
        },
        set(value){   //有人修改name时调用
            console.log("有人修改了name属性,我发现了,我要去更新界面!")
            person.name=value
        }
    })
    Object.defineProperty(p,'age',{
        get(){  //有人读取age时调用
            return person.age
        },
        set(value){   //有人修改name时调用
            console.log("有人修改了age属性,我发现了,我要去更新界面!")
            person.age=value
        }
    })*/
    // #endregion

    //模拟Vue3中实现响应式
    /*const p=new Proxy(person,{
        //有人读取p的某个属性时调用
        get(target,propName){
            console.log(`有人读取了p身上的${propName}属性`)
            return target[propName]
        },
        //有人修改p的某个属性、或给p追加某个属性时调用
        set(target,propName,value){
            console.log(`有人修改了p身上的${propName}属性,我要去更新界面了`)
            return target[propName]=value
        },
        //有人删除p的某个属性时调用
        deleteProperty(target, propName) {
            console.log(`有人删除了p身上的${propName}属性,我要去更新界面了`)
            return delete target[propName]
        }
    })*/


    obj={a:1,b:2}
    //通过Object.defineProperty去操作
    const x1=Object.defineProperty(obj,'c',{
        get(){
            return 3
        }
    })
    const x2=Object.defineProperty(obj,'c',{
        get(){
            return 100
        }
    })

    //通过Reflect.defineProperty去操作
    /*const x1=Reflect.defineProperty(obj,'c',{
        get(){
            return 3
        }
    })
    const x2=Reflect.defineProperty(obj,'c',{
        get(){
            return 100
        }
    })
    if(x2){
        console.log("某某某操作成功了!")
    }else{
        console.log("某某某操作失败了!")
    }*/



</script>
</body>
</html>

在这里插入图片描述

使用Reflect改善Vue3的响应式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Vue3的响应式原理</title>
</head>
<body>
<script>
    let person={
        name:"张三",
        age:18
    }

    //模拟Vue2中实现响应式
   // #region   解决vsCode中折叠后但又打开的情况
   /* let p={}
    Object.defineProperty(p,'name',{
        configurable:true,  //可配置的,可以删除属性
        get(){  //有人读取name时调用
            return person.name
        },
        set(value){   //有人修改name时调用
            console.log("有人修改了name属性,我发现了,我要去更新界面!")
            person.name=value
        }
    })
    Object.defineProperty(p,'age',{
        get(){  //有人读取age时调用
            return person.age
        },
        set(value){   //有人修改name时调用
            console.log("有人修改了age属性,我发现了,我要去更新界面!")
            person.age=value
        }
    })*/
    // #endregion

    //模拟Vue3中实现响应式
    const p=new Proxy(person,{
        //有人读取p的某个属性时调用
        get(target,propName){
            console.log(`有人读取了p身上的${propName}属性`)
            // return target[propName]
            return Reflect.get(target,propName)
        },
        //有人修改p的某个属性、或给p追加某个属性时调用
        set(target,propName,value){
            console.log(`有人修改了p身上的${propName}属性,我要去更新界面了`)
            // return target[propName]=value
            return Reflect.set(target,propName,value)
        },
        //有人删除p的某个属性时调用
        deleteProperty(target, propName) {
            console.log(`有人删除了p身上的${propName}属性,我要去更新界面了`)
            // return delete target[propName]
            return Reflect.deleteProperty(target,propName)
        }
    })


    /*obj={a:1,b:2}
    //通过Object.defineProperty去操作
    const x1=Object.defineProperty(obj,'c',{
        get(){
            return 3
        }
    })
    const x2=Object.defineProperty(obj,'c',{
        get(){
            return 100
        }
    })
*/
    //通过Reflect.defineProperty去操作
    /*const x1=Reflect.defineProperty(obj,'c',{
        get(){
            return 3
        }
    })
    const x2=Reflect.defineProperty(obj,'c',{
        get(){
            return 100
        }
    })
    if(x2){
        console.log("某某某操作成功了!")
    }else{
        console.log("某某某操作失败了!")
    }*/



</script>
</body>
</html>

在这里插入图片描述

总结

vue2.x的响应式

  1. 实现原理
    (1)对象类型:通过Object.defineProperty()对属性的读取、修改进行拦截(数据劫持)
    (2)数组类型:通过重写更新数组的一系列方法来实现拦截。(对数组的变更方法进行了包裹)
Object.defineProperty(data,'count',{
	get(){},
	set(){}![请添加图片描述](https://img-blog.csdnimg.cn/6b2ee7c1953e4b958834375f9718e4ec.gif)

})
  1. 存在问题
    (1)新增属性、删除属性,界面不会更新
    (2)直接通过下标修改数组,界面不会自动更新

vue3的响应式

  1. 实现原理
    (1)通过Proxy(代理):拦截对象中任意属性的变化,包括:属性值的读写、属性的添加、属性的删除等
    (2)通过Reflect(反射):对源对象的属性进行操作
    (3)MDN文档中描述的Proxy与Reflect:
  • Proxy
  • Reflect
new Proxy(data,{
	//拦截读取属性值
	get(target,prop){
		return Reflect.get(target,prop)
	},
	//拦截设置属性值或添加新属性
	set(target,prop,value){
		return Reflect.set(target,prop,value)
	},
	//拦截删除属性
	deleteProperty(target,prop){
		return Reflect.deleteProperty(target,prop)
	}
})

proxy.name="tom"

reactive对比ref

  1. 从定义数据角度对比
    (1)ref用来定义:基本类型数据
    (2)reactive用来定义:对象(或数组)类型数据
    (3)备注:ref也可以用来定义对象(或数组)类型数据,它内部会自动通过reactive转为代理对象
  2. 从原理角度对比
    (1)ref通过Object.defineProperty()
    getset来实现响应式(数据劫持)
  3. 从使用角度对比:
    (1)ref定义的数据:操作数据需要.value,读取数据时模板中直接读取不需要.value
    (2)reactive定义的数据:操作数据与读取数据:均不需要.value

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

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

相关文章

二分搜索树

一、概念及其介绍 二分搜索树&#xff08;英语&#xff1a;Binary Search Tree&#xff09;&#xff0c;也称为 二叉查找树 、二叉搜索树 、有序二叉树或排序二叉树。满足以下几个条件&#xff1a; 若它的左子树不为空&#xff0c;左子树上所有节点的值都小于它的根节点。若它…

程序环境和预处理(上)——“C”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰的内容是C语言中的程序环境和预处理这个知识点&#xff0c;这块知识点是小雅兰地C语言的最后一块知识点了&#xff0c;以后可能会更新一些C语言的书籍的阅读&#xff0c;比如&#xff1a;《C Primer Plus》和《C语言深度剖析》。…

腾讯云快直播低延时播放质量的优化实践

直播已经潜移默化成为许多人日常生活密不可分的一部分。无论是紧张刺激的比赛直播&#xff0c;还是垂涎欲滴的美食直播&#xff0c;亦或者自卖自夸的购物直播&#xff0c;大家都不希望在观看时出现长时间的加载和卡顿&#xff0c;对一些需要观众及时反馈的直播场景&#xff0c;…

【vue】Vue 全局API 详细介绍(nextTick、set、delete、......)

文章目录一、Vue.extend(options)二、 Vue.component三、Vue.nextTick([callback,context])/this.nextTick([callback,context])四、Vue.set(target,propertyName/index,value)/this.set(target,propertyName/index,value)五、Vue.delete(target,propertyName/index)六、Vue.fi…

算法:链表和数组哪个实现队列更快

背景 对于这个问题&#xff0c;我们先来思考一下数组和链表各有什么特点。 数组&#xff1a;连续存储&#xff0c;push 很快&#xff0c;shift 很慢。 链表&#xff1a;非连续存储&#xff0c;add、delete 都很快&#xff0c;但是查找很慢。 所以&#xff0c;我们可以得出结论…

QT 安装 及环境变量配置及出现的错误的解决方法

文章目录QT安装教程(win版)下载链接点击 产品 Qt开发工具点击 下载Qt下滑点击 开源用户下载下滑点击 下载Qt在线安装程序点击 win版本下载打开程序这一步可能遇到的问题1.在自己有Qt账号的情况下&#xff0c;下一步无法点击2.弹出一句话You need to verify your Qt account eai…

基础排序算法【快速排序+优化版本+非递归版本】

基础排序算法【快速排序优化版本非递归版本】&#x1f4af;&#x1f4af;&#x1f4af;⏰【快速排序】◽1.hoare法◽2.挖坑法◽3.前后指针法◽4.特性总结⏰【优化版本】◽1.随机选key◽2.三路取中◽3.小区间优化⏰【非递归版本】⏰【测试效率】排序OJ(可使用各种排序跑这个OJ)⏰…

CDH 6.3.2集群安装部署

文章目录CDH 6.3.2集群安装部署一 CDH概要1.1 CDH的背景1.2 CDH介绍二 环境准备2.1 安装部署环境2.2 部署规划2.3 服务器主机映射2.4 服务器免登录配置2.5 防火墙关闭2.6 关闭Selinux2.7 设置最大打开文件2.8 关闭最大透明页面压缩2.9 设置Swappiness空间2.10 安装JDK2.11 MySQ…

mysql中增删改成的练习

文章目录一、表的创建1.student表的数据2、课程表的数据course3、学生成绩表的数据二、操作序列1、查询计算机系cs的全体学生学号、姓名和性别2、检索选修了课程号为2的学生号和姓名3、检索至少选修了三门课以上的学生号4、检索选修了全部课程的学生5、在原表的基础上创建一个视…

java并发-线程池

java并发-线程池 线程池的介绍 Java线程池表示一组等待工作并多次重用的工作线程。在线程池的情况下&#xff0c;创建了一组固定大小的线程。服务提供者从线程池中拉出一个线程并分配一个作业。完成作业后&#xff0c;线程再次包含在线程池中。 使用线程池可以节省多线程应用…

Revit中如何绘制四面倾斜的屋顶?

一、Revit中如何绘制四面倾斜的屋顶&#xff1f; 如下图所示&#xff0c;像这种坡屋顶有两种方法进行绘制。具体操作如下。 第一种&#xff1a;定义坡度。 1、点击建筑选项卡中的屋顶按钮。 2、选择使用矩形工具。将偏移值修改为500。将屋顶迹线绘制出来。 3、选中全部屋顶迹…

信号浪涌保护器SPD选型方案

1.最大连续工作电压&#xff08;Uc&#xff09;&#xff1a;信号电路的最大电压必须小于Uc 最大连续工作电压Uc是最大工作信号电压&#xff0c;是电涌保护装置长期运行的信号电压或直流电压的最大有效值。这也是在额定漏电流条件下线与线之间或线与地之间的最大电压&#xff0…

UFT常用检查点的使用

录制时Flight自动打开。创建三个Action,分别命名为01_Login/02_New Order/03_Logout&#xff0c; 在Action里录制对应的Login/New Order/Logout操作。用飞机票预定系统订票&#xff0c;在02_New Order中设置起飞和到达城市参数化&#xff0c;用本地表数据&#xff08;至少2组数…

【排序算法(二)】选择排序(直接选择排序堆排序)

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录1、直接选择排序1.1 …

腾讯云轻量应用服务器搭建网站教程(WordPress为例)

腾讯云轻量应用服务器搭建WordPress网站教程&#xff0c;先安装WordPress应用镜像&#xff0c;然后远程连接轻量应用服务器获取WP用户名和密码&#xff0c;域名DNS解析到轻量服务器IP地址&#xff0c;登陆WordPress后台管理全过程&#xff0c;腾讯云百科来详细说下腾讯云轻量服…

作用域、闭包的理解、GC算法

1、全局作用域的变量是不会自动的的释放掉的 例如在 <script >let title "hello world"function coming(){alter(title) }</script> 只要不关闭网页或者浏览器&#xff0c;我们都可以在控制台调用 2、作用域环境我们可以理解为一块内存数据 3、函数作…

研报精选230416

目录 【行业230416国联证券】汽车行业4月周报&#xff1a;上海车展期待值高&#xff0c;政策加码一体化压铸【行业230416国联证券】农林牧渔行业周报&#xff1a;低猪价加深去化幅度&#xff0c;高标准农田建设推进【个股230416安信证券_万华化学】Q1业绩超预期&#xff0c;TDI…

靶机精讲之Prime

主机发现 192靶机 扫描靶机 进行对端口的服务和版本的扫描 保存信息 扫描UDP 一般都是http优先然后再shh vuln脚本扫描 web渗透 查看源码 目录爆破 dirb 翻刚才扫到的目录 dirb指定文件类型扫描 读取文件 保存 浏览链接 wfuzz模糊测试 专门扫PHP 只有两目录 浏览页面 模糊…

react2:children属性 - props进阶 - 生命周期

children属性&#xff1a;父想给子组件传递内容&#xff0c;都需要通过children占位 children属性&#xff1a;类似vue中的slot效果 props 类型验证 &#xff1a;现在都是 typescript 替代了 ref 放普通标签上可以获取dom节点 ref 放组件上获取组件实例&#xff0c;可以调用组件…

「C/C++」C/C++内存四大分区

博客主页&#xff1a;何曾参静谧的博客 文章专栏&#xff1a;「C/C」C/C学习 目录术语一、文本区&#xff08;Text Segment&#xff09;/ 代码区二、数据区&#xff08;Data Segment&#xff09;/ 全局区三、栈区&#xff08;Stack Segment&#xff09;四、堆区&#xff08;Hea…