vue3.0之组合API有哪些(详解)

news2025/1/23 0:52:32

vue3.0之组合API有哪些

  • 一、setup函数
  • 二、生命周期
  • 三、reactive函数
  • 四、toRef函数
  • 五、toRefs函数
  • 六、ref函数
  • 七、知识运用案例
  • 八、computed函数
  • 九、watch函数
  • 十、ref属性
  • 十一、父子通讯
    • 1.父传子
    • 2.子传父
  • 十二、依赖注入
  • 十三、补充 v-model语法糖(简写)
  • 十四、补充 mixins语法

一、setup函数

  • setup 是一个新的组件选项,作为组件中使用组合API的起点
  • 从组件生命周期来看,它的执行在组件实例创建之前vue2.x的beforeCreate执行
  • 这就意味着在setup函数中 this 还不是组件实例,this 此时是 undefined
  • 在模版中需要使用的数据和函数,需要在 setup 返回

演示代码

<template>
  <div class="container">
    <h1 @click="say()">{{msg}}</h1>
  </div>
</template>
<script>
export default {
  setup () {
    console.log('setup执行了')
    console.log(this) //undefined
    // 定义数据和函数
    const msg = 'hi vue3'
    const say = () => {
      console.log(msg)
    }

    return { msg , say}  //必须以对象形式返回
  },
  beforeCreate() {
    console.log('beforeCreate执行了')
    console.log(this)
  }
}
</script>

二、生命周期

vue2.0vue3.0
beforeCreatesetup 创建实例前
created
beforeMountonBeforeMount 挂载DOM前
mountedonMounted 挂载DOM后
beforeUpdateonBeforeUpdate 更新组件前
updatedonUpdated 更新组件后
beforeDestroyonBeforeUnmount 卸载销毁前
destroyedonUnmounted 卸载销毁后
  • 注意
    • 1.页面中钩子函数需要先从vue引入
    • 2.需要写在setup函数内部
    • 3.可以多次使用同一个钩子,执行顺序和书写顺序相同

实例代码

<template>
  <div class="container">
    container
  </div>
</template>
<script>
import { onBeforeMount, onMounted } from 'vue'
export default {
  setup () {
    onBeforeMount(()=>{
      console.log('DOM渲染前',document.querySelector('.container'))
    })
    onMounted(()=>{
      console.log('DOM渲染后1',document.querySelector('.container'))
    })
    onMounted(()=>{
      console.log('DOM渲染后2',document.querySelector('.container'))
    })
  },
}
</script>

三、reactive函数

  • reactive是一个函数,它可以定义一个复杂数据类型,成为响应式数据。
  • 通常是用来定义响应式对象数据

实例代码

<template>
    <div>
        <div>名字{{ obj.name }}</div>
        <div>年龄{{ obj.age }}</div>
        <button @click="updateName()">更改名字</button>
    </div>
</template>
  
<script>
import { reactive } from 'vue'
export default {
    name: 'App',
    setup() {
        //定义对象响应式数据
        const obj = reactive({
            age: 18,
            name: '李四'
        })
        //修改名字
        const updateName = () => {
            obj.name = '张三'
            console.log('更改了', obj.name)
        }
        return { obj, updateName }
    }
}
</script>

四、toRef函数

  • toRef是函数,转换响应式对象中某个属性为单独响应式数据,并且值是关联的
  • 使用场景:有一个响应式对象数据,但是模版中只需要使用其中一项数据

示例代码

<template>
  <div class="container">
    {{name}} <button @click="updateName">修改数据</button>
  </div>
</template>
<script>
import { reactive, toRef } from 'vue'
export default {
  name: 'App',
  setup () {
    // 1. 响应式数据对象
    const obj = reactive({
      name: 'ls',
      age: 10
    })
    console.log(obj)
    // 2. 模板中只需要使用name数据
    // 注意:从响应式数据对象中解构出的属性数据,不再是响应式数据
    // let { name } = obj 不能直接解构,出来的是一个普通数据
    const name = toRef(obj, 'name')
    // console.log(name)
    const updateName = () => {
      console.log('updateName')
      // toRef转换响应式数据包装成对象,value存放值的位置
      name.value = 'zs'
    }

    return {name, updateName}
  }
}
</script>

五、toRefs函数

  • toRefs是函数,转换响应式对象中所有属性为单独响应式数据,对象成为普通对象,并且值是关联的
  • 剥离响应式对象(解构|展开),想使用响应式对象中的多个或者所有属性做为响应式数据
<template>
    <div>
        <div>名字{{ name }}</div>
        <button @click="updateName()">更改名字</button>
    </div>
</template>
  
<script>
import { reactive, toRef, toRefs } from 'vue'
export default {
    name: 'App',
    setup() {
        //1.定义响应式数据对象
        const obj = reactive({
            age: 18,
            name: '李四'
        })
        //obj1 具有响应式
        const obj1 = toRefs(obj)
        console.log('打印obj1', obj1)
        const updateName = () => {
            //更改方式1
            // obj1.name.value = "张三"
            //更改方式2 (直接更改响应式数据)
            obj.name = "张三"
        }
        return { ...obj1, updateName }
    }
}
</script>

六、ref函数

  • ref函数,常用于简单数据类型定义为响应式数据
  • 在修改值,获取值的时候,需要.value
  • 在模板中使用ref申明的响应式数据,可以省略.value
  • 注意
    • 当你明确知道需要的是一个响应式数据 对象 那么就使用 reactive 即可
    • 其他情况使用ref

示例代码

<template>
    <div>
        <div>名字{{ name }}</div>
        <button @click="updateName()">更改名字</button>
    </div>
</template>
  
<script>
import { ref } from 'vue';
export default {
    name: 'App',
    setup() {
        const name = ref('李四')
        const updateName = () => {
            name.value = '张三'
        }
        return { name, updateName }
    }
}
</script>

七、知识运用案例

在这里插入图片描述

<template>
  <div class="container">
    <div>坐标</div>
    <div>x: {{x}}</div>
    <div>y: {{y}}</div>
    <hr>
    <div>{{count}} <button @click="add">累加1</button></div>
  </div>
</template>
<script>
import { onMounted, onUnmounted, reactive , ref, toRefs} from 'vue'
const useMouse = () => {
    // 1. 记录鼠标坐标
    // 1.1 申明一个响应式数据,他是一个对象,包含x y
    const mouse = reactive({
      x: 0,
      y: 0
    })
    // 1.3 修改响应式数据
    const move = (e) => {
      mouse.x = e.pageX
      mouse.y = e.pageY
    }
    // 1.2 等dom渲染完毕。去监听事件
    onMounted(()=>{
      document.addEventListener('mousemove', move)
    })
    // 1.4 组件消耗,删除事件
    onUnmounted(()=>{
      document.removeEventListener('mousemove', move)
    })

    return mouse
}
export default {
  name: 'App',
  setup () {

    const mouse = useMouse()

    // 2. 数字累加
    const count = ref(0) 
    const add = () => {
      count.value ++
    }
    return { ...toRefs(mouse), count, add }
  }
}
</script>

八、computed函数

  • computed函数,是用来定义计算属性的,计算属性不能修改。
  • 总结
    • 给computed传入函数,返回值就是计算属性的值
    • 给computed传入对象,get获取计算属性的值,set监听计算属性改变。
<template>
    <div>
        <div>今年{{ age }}</div>
        <div>后年{{ newAge }}</div>
        <input v-model="newAge">
    </div>
</template>
  
<script>
import { computed, ref } from 'vue'
export default {
    name: 'App',
    setup() {
        //计算属性使用场景 需要依赖响应式数据得到一个新的数据
        const age = ref(18)
        // const newAge = computed(() => {

        //   return age.value + 2
        // })
        //计算属性高级用法
        const newAge = computed({
            //get方法 取值
            get() {
                return age.value + 2
            },
            //set方法 赋值
            set(val) {
                age.value = val - 2
                console.log('打印value', val)
            }
        })
        return { age, newAge }
    }
}
</script>

九、watch函数

  • 1.监听ref定义的响应式数据
  • 2.监听多个响应式数据
  • 3.监听reactive定义的响应式数据
  • 4.监听reactive定义的响应式数据,某一个属性
  • 5.深度监听和默认执行
<template>
  <div>
    <div>count的数量{{ count }}</div>
    <button @click="watchCount">监听ref</button>
    <hr>
    <div>名字:{{ obj.name }}</div>
    <div>年龄:{{ obj.age }}</div>
    <button @click="watchMore">监听多个响应式</button>
    <hr>
    <button @click="watchDeep">深度监听</button>
  </div>
</template>

<script>
import { reactive, ref, watch } from 'vue';
export default {
  name: 'App',
  setup() {
    //1.监听ref定义的响应式数据
    const count = ref(18)
    const watchCount = () => {
      count.value++
    }
    //第一个参数是监听的目标 
    //第二个参数为改变后触发的函数
    //第三个参数为配置项
    watch(count, (newval, oldval) => {
      console.log('ref变化了', newval, oldval)
    })

    //2.监听多个响应式数据
    const obj = reactive({
      name: '张三',
      age: '18',
      brand: {
        id: 1,
        name: '宝马'
      }
    })
    const watchMore = () => {
      obj.name = '李四'
    }
    watch(obj, (newVal, oldVal) => {
      console.log('多个响应式改变了', newVal, oldVal)
    })
    //3.监听多个响应式数据的变化
    watch([obj, count], (newVal, oldVal) => {
      console.log('监听多个响应式数据的变化', newVal, oldVal)
    })
    //4.监听reactive定义的某一个属性 例如obj.name
    watch(obj.name, (newVal, oldVal) => {
      console.log('监听reactive定义的某一个属性', newVal, oldVal)
    })
    //5.深度监听 和默认执行
    //()=>obj.brand return返回
    watch(() => obj.brand, (newVal, oldVal) => {
      console.log('深度监听并且默认执行', newVal, oldVal)
    }, {
      deep: true, //深度监听
      immediate: true //默认执行
    })
    const watchDeep = () => {
      obj.brand.id = 2
    }
    return { count, obj, watchCount, watchMore, watchDeep }
  }
}
</script>

十、ref属性

  • 单个元素:先申明ref响应式数据,返回给模版使用,通过ref绑定数据
  • 遍历的元素:先定义一个空数组,定一个函数获取元素,返回给模版使用,通过ref绑定这个函数
    • 有一个边界问题:组件更新的时候(增加li标签)会重复的设置dom元素给数组
// ref获取v-for遍历的DOM元素,需要在组件更新的时候重置接受dom元素的数组。
    onBeforeUpdate(()=>{
      list = []
    })

实例代码

<template>
  <div>
    <!-- vue2.0获取div元素 -->
    <!-- 1. 通过ref属性绑定该元素 -->
    <!-- 2. 通过this.$refs.box获取元素 -->
    <!-- <div ref="box">vue2.0获取div元素</div> -->
    <!-- vue2.0 获取v-for遍历的多个元素 -->
    <!-- 1. 通过ref属性绑定被遍历元素 -->
    <!-- 2. 通过this.$refs.li 获取所有遍历元素  -->
    <!-- <ul>
      <li v-for="i in 4" :key="i" ref="li">{{i}}</li>
    </ul> -->
    
    <!-- vue3.0获取div元素 -->
    <!-- 单个元素 -->
    <div ref="onebox">单个元素</div>
    <hr>
    
    <!-- 获取v-for遍历的DOM或者组件 -->
    <ul>
      <li v-for="i in 4" :key="i" :ref="setDom">{{ i }}</li>
    </ul>
  </div>
</template>

<script>
import { ref } from 'vue';
export default {
  name: 'App',
  setup() {
    //获取单个dom
    //1.先定义一个空的响应式数据ref定义的 并返回
    //2.想获取那个dom元素,在该元素使用ref绑定即可
    const onebox = ref(null)
    console.log('onebox', onebox);

    // 获取多个 v-for遍历
    //1.定义一个空数组 接收所有的li标签
    const domList = []
    //2.定义一个函数,往数组中插入dom
    const setDom = (li) => {
      console.log('setDom', li)
      domList.push(li)
      console.log('domList', domList)
    }
    return { onebox, setDom }
  }
}
</script>

十一、父子通讯

1.父传子

父组件

<template>
  <div class="container">
    <h1>父组件</h1>
    <p>{{money}}</p>
    <hr>
    <Son :money="money" />
  </div>
</template>
<script>
import { ref } from 'vue'
import Son from './Son.vue'
export default {
  name: 'App',
  components: {
    Son
  },
  // 父组件的数据传递给子组件
  setup () {
    const money = ref(100)
    return { money }
  }
}
</script>

子组件

<template>
    <div>
        <h1>子组件</h1>
        <p>money{{ money }}</p>
    </div>
</template>

<script>
import { onMounted } from 'vue';

export default {
    //子组件接收父组件传过来的值
    props: {
        money: {
            type: Number,
            default: 0
        }
    },
    setup(props) {
        //获取父组件的数据 money
        console.log('props传参', props.money)

        //获取失败
        onMounted(() => {
            // console.log('子组件money', this.money);
        })
    }
}
</script>

2.子传父

父组件

<template>
  <div>
    <h1>父组件</h1>
    <p>money{{ money }}</p>
    <hr>
    <Son :money="money" @changeBtn="changeBtn"></Son>
  </div>
</template>

<script>
import { ref } from 'vue';
import Son from './components/son.vue';
export default {
  components: {
    Son
  },
  name: 'App',
  setup() {
    //1.父组件数据 传递给子组件
    const money = ref(100)

    //定义子组件调用父组件的方法
    const changeBtn = (newMoney) => {
      console.log('子组件调用父组件的方法', newMoney)
      money.value = newMoney
    }
    return { money, changeBtn }
  }
}
</script>

子组件

<template>
    <div>
        <h1>子组件</h1>
        <p>money{{ money }}</p>
        <button @click="changeBtn()">花费50</button>
    </div>
</template>

<script>
import { onMounted } from 'vue';

export default {
    //子组件接收父组件传过来的值
    props: {
        money: {
            type: Number,
            default: 0
        }
    },
    //props父组件数据 
    //context 发现(包含emit方法) 触发自定义事件的函数
    //可解构 {emit}
    setup(props, context) {
        //获取父组件的数据 money
        console.log('props传参', props.money)

        //定义函数
        const changeBtn = () => {
            console.log('花费50元', context)
            //通知父组件
            context.emit('changeBtn', 50)
        }

        return { changeBtn }
    }
}
</script>

补充

  • 在vue2.x的时候 .sync 除去v-model实现双向数据绑定的另一种方式
<!-- <Son :money='money' @update:money="fn"  /> -->
<Son :money.sync='money'  />
  • 在vue3.0的时候,使用 v-model:money="money" 即可
//子组件 改值方法内
 //简写
context.emit('update:money', 50)

//父组件
<!-- 简写前 -->
    <!-- <Son :money="money" @update:money="changeBtn"></Son> -->
    <!-- 简写后 -->
    <Son v-model:money="money"></Son>

十二、依赖注入

使用场景

  • 有一个父组件,里头有子组件,有孙组件,有很多后代组件,共享父组件数据。
  • 父组件
<template>
  <div class="container">
    <h1>父组件 {{money}} <button @click="money=1000">发钱</button></h1>
    <hr>
    <Son />
  </div>
</template>
<script>
import { provide, ref } from 'vue'
import Son from './Son.vue'
export default {
  name: 'App',
  components: {
    Son
  },
  setup () {
    const money = ref(100)
    const changeMoney = (saleMoney) => {
      console.log('changeMoney',saleMoney)
      money.value = money.value - saleMoney
    }
    // 将数据提供给后代组件 provide
    provide('money', money)
    // 将函数提供给后代组件 provide
    provide('changeMoney', changeMoney)

    return { money }
  }
}
</script>
  • 子组件
<template>
    <div>
        <h2>子组件</h2>
        <p>money{{ money }}</p>
        <Sun></Sun>
    </div>
</template>

<script>
import Sun from './sun.vue';
import { inject } from 'vue'
export default {
    components: {
        Sun
    },

    setup() {
        //接收祖先传递的数据 inject
        const money = inject('money')
        return { money }
    }
}
</script>
  • 孙组件
<template>
  <div class="container">
    <h3>孙组件 {{money}} <button @click="fn">消费20</button></h3>
  </div>
</template>
<script>
import { inject } from 'vue'
export default {
  name: 'GrandSon',
  setup () {
    const money = inject('money')
    // 孙组件,消费50,通知父组件App.vue组件,进行修改
    // 不能自己修改数据,遵循单选数据流原则,大白话:数据谁定义谁修改
    const changeMoney = inject('changeMoney')
    const fn = () => {
      changeMoney(20)
    }
    return {money, fn}
  }
}
</script>

总结

  • provide函数提供数据和函数给后代组件使用
  • inject函数给当前组件注入provide提供的数据和函数

十三、补充 v-model语法糖(简写)

  • 在vue2.0中v-mode语法糖简写的代码 <Son :value="msg" @input="msg=$event" />
  • 在vue3.0中v-model语法糖有所调整:<Son :modelValue="msg" @update:modelValue="msg=$event" />

父组件

<template>
  <div class="container">
    <!-- 如果你想获取原生事件事件对象 -->
    <!-- 如果绑定事函数 fn fn(e){ // e 就是事件对象 } -->
    <!-- 如果绑定的是js表达式  此时提供一个默认的变量 $event -->
    <h1 @click="$event.target.style.color='red'">父组件 {{count}}</h1>
    <hr>
    <!-- 如果你想获取自定义事件  -->
    <!-- 如果绑定事函数 fn fn(data){ // data 触发自定义事件的传参 } -->
    <!-- 如果绑定的是js表达式  此时 $event代表触发自定义事件的传参 -->
    <!-- <Son :modelValue="count" @update:modelValue="count=$event" /> -->
    <Son v-model="count" />
  </div>
</template>
<script>
import { ref } from 'vue'
import Son from './Son.vue'
export default {
  name: 'App',
  components: {
    Son
  },
  setup () {
    const count = ref(10)
    return { count }
  }
}
</script>

子组件

<template>
  <div class="container">
    <h2>子组件 {{modelValue}} <button @click="fn">改变数据</button></h2>
  </div>
</template>
<script>
export default {
  name: 'Son',
  props: {
    modelValue: {
      type: Number,
      default: 0
    }
  },
  setup (props, {emit}) {
    const fn = () => {
      // 改变数据
      emit('update:modelValue', 100)
    }
    return { fn }
  }
}
</script>
  • 总结: vue3.0封装组件支持v-model的时候,父传子:modelValue 子传父 @update:modelValue
  • 补充: vue2.0的 xxx.sync 语法糖解析 父传子 :xxx 子传父 @update:xxx 在vue3.0 使用 v-model:xxx 代替

十四、补充 mixins语法

  • 混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能。一个混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被“混合”进入该组件本身的选项。
  • 理解全局混入:所有组件混入了这些逻辑代码
// 全局混入 全局mixin
// vue2.0 写法  Vue.mixin({})
app.mixin({
  methods: {
    say () {
      console.log(this.$el,'在mounted中调用say函数')
    }
  },
  mounted () {
    this.say()
  }
})
<template>
  <div class="container1">
    <h1> 作者:周杰伦  <a href="javascript:;">关注</a> </h1>
    <hr>
    <Son />
  </div>
</template>
<script>
import Son from './Son.vue'
export default {
  name: 'App',
  components: {
    Son
  }
}
</script>
<template>
  <div class="container2">
    <h2> 作者:周杰伦  <button>关注</button> </h2>
  </div>
</template>
<script>
export default {
  name: 'Son'
}
</script>
<style scoped lang="less"></style>
  • 理解局部混入:通过mixins选项进行混入
// 配置对象
export const followMixin =  {
  data () {
    return {
      loading: false
    }
  },
  methods: {
    followFn () {
      this.loading = true
      // 模拟请求
      setTimeout(()=>{
        // 省略请求代码
        this.loading = false
      },2000)
    }
  }
}
<template>
  <div class="container1">
    <h1> 作者:周杰伦  <a href="javascript:;" @click="followFn">{{loading?'请求中...':'关注'}}</a> </h1>
    <hr>
    <Son />
  </div>
</template>
<script>
import Son from './Son.vue'
import {followMixin} from './mixins'
export default {
  name: 'App',
  components: {
    Son
  },
  mixins: [followMixin]
}
</script>
<template>
  <div class="container2">
    <h2> 作者:周杰伦  <button @click="followFn">{{loading?'loading...':'关注'}}</button> </h2>
  </div>
</template>
<script>
import {followMixin} from './mixins'
export default {
  name: 'Son',
  mixins: [followMixin]
}
</script>
<style scoped lang="less"></style>
  • 总结: 在vue2.0中一些可复用的逻辑可以使用mixins来封装,当是需要考虑逻辑代码冲突问题。vue3.0的组合API很好的解决了这个问题,就不在推荐使用mixins了。

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

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

相关文章

【档案专题】三、电子档案管理系统

导读&#xff1a;主要针对电子档案管理系统相关内容介绍。对从事电子档案管理信息化的职业而言&#xff0c;不断夯实电子档案管理相关理论基础是十分重要。只有通过不断梳理相关知识体系和在实际工作当中应用实践&#xff0c;才能走出一条专业化加职业化的道路&#xff0c;从而…

el-cascader级联选择器那些事

el-cascader级联选择器那些事 1、获取选中的节点及其所有上级 vue3element-plusts 1、获取选中的节点及其所有上级 使用cascader组件提供的getCheckedNodes() <el-cascader :options"options" :show-all-levels"false" change"changeCascader&q…

cocosCreator笔记 之Spine了解

版本&#xff1a; 3.4.0 参考&#xff1a; Spine 骨骼动画资源 Spine Skeleton组件 cocosLua 之 骨骼动画 简介 使用spine动画&#xff0c;cocosCreator目前支持的版本&#xff1a; creator版本spine版本V3.0 及以上v3.8&#xff08;原生平台不支持特定版本 v3.8.75&…

北京银行发放门头沟区首笔知识产权质押贷款

6月&#xff0c;位于北京中关村门头沟科技园、专注于研制工业母机的民营企业——北京精雕科技集团有限公司&#xff08;以下简称“精雕科技集团”&#xff09;&#xff0c;因生产经营急需资金&#xff0c;但是由于缺乏抵押物而陷入了融资困境。“精雕科技集团与北京银行合作已长…

java习题3

292. Nim 游戏 难度简单 你和你的朋友&#xff0c;两个人一起玩 Nim 游戏&#xff1a; 桌子上有一堆石头。你们轮流进行自己的回合&#xff0c; 你作为先手 。每一回合&#xff0c;轮到的人拿掉 1 - 3 块石头。拿掉最后一块石头的人就是获胜者。 假设你们每一步都是最优解。…

Slf4j日志集成

Slf4j日志集成 下面就是集成步骤&#xff0c;按着做就可以了 1、logback-spring.xml 哪个服务需要记录日志就将在哪个服务的resource下新建logback-spring.xml文件&#xff0c;里面的内容如下&#xff1a; <!-- 级别从高到低 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 …

微软宣布Win10准备热烈的迎接Docker

在DockerCon 2017大会上&#xff0c;Docker团队今天宣布了LinuxKit&#xff0c;这是一个安全、干净和便携式的Linux子系统container容器环境。LinuxKit允许工具构建自定义的Linux子系统&#xff0c;可以仅包含完全运行时平台的组件需要。所有的系统服务都是可替换的容器&#x…

Leetcode-每日一题【25.k个一组翻转链表】

题目 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内…

xml2json xml转换成json PHP phpstorm

phpstorm 的插件 xml2json快速实现 xml转换成json 1&#xff0c;先安装好Phpstorm 2 二、好用的插件 进入设置页面&#xff0c;快捷键CtrlAlts&#xff0c;或者Files->settings 作者是meizu &#xff0c;应该是魅族公司&#xff0c;贡献的插件

【C语言进阶技巧】探秘字符与字符串函数的奇妙世界

【C语言进阶技巧】探秘字符与字符串函数的奇妙世界 1. strlen函数1.1 strlen函数的使用介绍1.2 strlen函数的模拟实现1.2.1 计数法&#xff08;使用临时变量&#xff09;1.2.1 递归法&#xff08;不使用临时变量&#xff09;1.2.3 指针减指针的方法 2. strcpy函数2.1 strcpy函数…

rust

文章目录 rustCargoCreating a rust project How to Debug Rust Programs using VSCodebasic debuggingHow to pass arguments in Rust debugging with VS Code. References rust Cargo Cargo is a package management tool used for downloading, compiling, updating, and …

Linux---gdb

Linux调试器-gdb使用 GDB&#xff08;GNU调试器&#xff09;是一个在多种操作系统&#xff08;包括Linux&#xff09;上使用的功能强大的调试器。它允许开发者对程序进行调试&#xff0c;以便找出程序中的错误、理解程序的执行过程和进行性能分析。 程序的发布有两种&#xf…

想要学习编程,有什么推荐的书籍吗?

编程是以计算机程序的形式创建创新解决方案的艺术&#xff0c;用于解决各个领域不同的问题&#xff0c;从经典的数学难题和日常生活问题到天气预报以及寻找和理解宇宙中的新奇观。 尽管编程和编码通常可以互换使用&#xff0c;但编程不仅仅是编码。编码代表编程的这一部分&…

mysql数据库 索引

目录 1.定义 2.作用 3.索引使用场景 4.索引分类 5.案例 普通索引 唯一索引 主键索引 组合索引 全文索引 删除索引 1.定义 索引是一个排序的列表 在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址 ### 可以当作目录 2.作用 方便定位信息 做…

我终于成功登上了JS 框架榜单,并且仅落后于 React 4 名!

前言 如期而至&#xff0c;我独立开发的 JavaScript 框架 Strve.js 迎来了一个大版本5.6.2。此次版本距离上次大版本发布已经接近半年之多&#xff0c;为什么这么长时间没有发布新的大版本呢&#xff1f;主要是研究 Strve.js 如何支持单文件组件&#xff0c;使代码智能提示、代…

[洛谷]P8662 [蓝桥杯 2018 省 AB] 全球变暖(dfs)

读题不规范&#xff0c;做题两年半&#xff01; 注意&#xff1a;被海水淹没后的陆地应用另一个字符表示&#xff0c;而不是把它变为海洋&#xff0c;这个点可以便利&#xff0c;但不能被当作起点&#xff0c;不然就只有 36 分。 ACocde: #include<bits/stdc.h> using…

nodejs 下载地址 阿里云开源镜像站

nodejs 下载地址 阿里云开源镜像站 https://mirrors.aliyun.com/nodejs-release/ 我们下期见&#xff0c;拜拜&#xff01;

STM32(HAL库)通过ADC读取MQ2数据

目录 1、简介 2、CubeMX初始化配置 2.1 基础配置 2.1.1 SYS配置 2.1.2 RCC配置 2.2 ADC外设配置 2.3 串口外设配置 2.4 项目生成 3、KEIL端程序整合 3.1 串口重映射 3.2 ADC数据采集 3.3 主函数代 3.4 效果展示 1、简介 本文通过STM32F103C8T6单片机通过HAL库方式对M…

【java】JMeter进行web测试

JMeter进行web测试 1.对网页进行负载测试新建线程组添加默认 HTTP 请求属性添加cookie支持添加HTTP请求添加监听器以便于查看结果登录网站 2. 测试本地web项目3. 其他使用 URL 重写处理用户会话使用标题管理器 参考JMeter用户手册 https://jmeter.net/usermanual/build-web-te…

PC与(VMware)linux的IP互通

一、环境 二、NAT模式 NAT&#xff08;Network Address Translation&#xff09;网络地址转换&#xff0c;允许一个整体机构以一个公用IP地址出现在Internet上&#xff0c;即把内部私有网络地址翻译成合法网络IP地址的技术。家用路由器一般都是NAT模式。让虚拟系统借助NAT&…