【细节】Vue3基本使用笔记

2023-11-05

vite

文档:https://cn.vitejs.dev/guide/

安装:

使用 NPM:

$ npm create vite@latest

使用 Yarn:

$ yarn create vite

使用 PNPM:

$ pnpm create vite

选择项目名称:? Project name: » vite-project

选择框架:? Select a framework: » - Use arrow-keys. Return to submit.

Vanilla
Vue
React
Preact
Lit
Svelte
Others

配置eslint

官网:https://github.com/eslint/eslint

安装:npm init @eslint/config

配置:

√ How would you like to use ESLint? · style
√ What type of modules does your project use? · esm
√ Which framework does your project use? · vue
√ Does your project use TypeScript? · No / Yes  No
√ Where does your code run? · browser
√ How would you like to define a style for your project? · guide
√ Which style guide do you want to follow? · standard
√ What format do you want your config file to be in? · JavaScript
Checking peerDependencies of eslint-config-standard@latest
The config that you've selected requires the following dependencies:

eslint-plugin-vue@latest eslint-config-standard@latest eslint@^8.0.1 eslint-plugin-import@^2.25.2 eslint-plugin-n@^15.0.0 eslint-plugin-promise@^6.0.0
√ Would you like to install them now? · No / Yes  Yes
√ Which package manager do you want to use? · yarn

认识vue3.0生命周期钩子函数

  • setup 创建实例前
  • onBeforeMount 挂载DOM前
  • onMounted 挂载DOM后
  • onBeforeUpdate 更新组件前
  • onUpdated 更新组件后
  • onBeforeUnmount 卸载销毁前
  • onUnmounted 卸载销毁后
<script setup>
// setup 这个函数替代了beforeCreate、created生命周期函数
import { onMounted } from 'vue'
const PI = 3.1414926

onMounted(() => {
  console.log('组件挂载之后')
})
</script>

setup的细节

setup执行的时机

  • beforeCreate之前执行(一次), 一旦props被解析就会执行setup,此时组件对象还没有创建
  • thisundefined, 不能通过this来访问data/computed/methods / props
  • 其实所有的composition API相关回调函数中也都不可以

setup的返回值

  • 一般都返回一个对象: 为模板提供数据, 也就是模板中可以直接使用此对象中的所有属性/方法
  • 返回对象中的属性会与data函数返回对象的属性合并成为组件对象的属性
  • 返回对象中的方法会与methods中的方法合并成功组件对象的方法
  • 如果有重名, setup优先

注意:

  • 一般不要混合使用: methods中可以访问setup提供的属性和方法, 但在setup方法中不能访问datamethods
  • setup不能是一个async函数: 因为返回值不再是return的对象, 而是promise, 模板看不到return对象中的属性数据

setup的参数

  • props: 包含props配置声明且传入了的所有属性的对象
  • attrs: 包含没有在props配置中声明的属性的对象, 相当于 this.$attrs
  • slots: 包含所有传入的插槽内容的对象, 相当于 this.$slots
  • emit: 用来分发自定义事件的函数, 相当于 this.$emit

ref

    {{ PI }}
    <button @click="change">改变数据</button>
    <ul>
      <li v-for="user in userlist" :key="user.name">{{ user.name }}</li>
    </ul>
    <button @click="adduser">添加学员</button>
import { ref } from 'vue'
//创建一个响应式的数据 ref可以创建任何类型的数据
const PI = ref(3.1414926)
const change = () => {
  //ref创建的数据,只能通过.value来修改
  PI.value = 3.14
}
const userlist = ref([
  { name: "张三", age: 18 },
  { name: "李四", age: 19 },
  { name: "王五", age: 20 },
]);
const adduser = () => {
  userlist.value.push({ name: "赵六", age: 21 });
};

reactive

    <div>
      {{ student.name }} {{ student.age }}
      <button @click="updatestu">修改学员</button>
    </div>
    <div>
      {{ nameref }} {{ ageref }}
      <button @click="updatename">更新结构出来的name</button>
    </div>
import { reactive } from 'vue'
// reactive创建的响应式数据是一个对象 可以直接修改对象的属性
let student = reactive({
  name: '张三',
  age: 18,
})
const updatestu = () => {
  student.name = '李四'
  console.log(student)
}
// 注意:1.reactive创建的对象 如果把对象里面的属性结构出来 他们就不是响应式的了
//      2.如果用一个新的响应式对象 替换掉原来的对象 也会导致结构出来的属性不是响应式的
let { name, age } = student
const updatename = () => {
  name = '王五'
  student = reactive({
    name: '赵六',
    age: 18,
  })
}
//如果想要结构出来的属性是响应式的 需要用toRef()包裹一下
const nameref = toRefs(student,'name');
const ageref = toRefs(student,'age')
const updatename = () => {
  nameref.value = "王五";
  ageref.value = 99
};
//转换响应式对象中所有属性为单独响应式数据
import { toRefs } from "vue";
const studentrefs = toRefs(student);
const updatename = () => {
  studentrefs.age.value = 100
};

computed计算属性

<template>
  <div>
    {{age}}==>{{age2}}
    <button @click="handleAdd">age+1</button>
    <div>{{fullName}}</div>
    <button @click="changeName">改变成李四</button>
  </div>
</template>

<script setup>
import { ref, computed } from 'vue'
const age = ref(17)
const handleAdd = () => {
  age.value++
}
const age2 = computed(() =>
  age.value >= 18 ? '成年' : '未成年'
)

const firstName = ref('张')
const lastName = ref('三')
const fullName = computed({
  get () {
    return firstName.value + lastName.value
  },
  set (value) {
    const names = value.split(' ')
    firstName.value = names[0]
    lastName.value = names[1]
  }
})
const changeName = function () {
  fullName.value = '李 四'
}
</script>

watch监听

1.监听单个的ref

如果ref是简单数据类型,要加value,复杂数据类型不用加

const user = ref({
  username: 'jack',
  age: 19,
  pet: {
    name: '小花',
    age: 2
  }
})
const changeUser = function () {
  user.value.pet.name = 'xiaohei'
}

watch(user.value, (newVal) => {
  console.log('user发生了变化', newVal)
})

2.监听多个数据组成的数组,参数的顺序需要和数组中的顺序一致

watch([firstName, lastName], ([newFirstName, newLastName]) => {
  fullName.value = newFirstName + newLastName
})

3.监听getter函数

watch(
  () => firstName.value + lastName.value,
  (newVal) => {
    fullName.value = newVal
  }
)

特别注意

4.监听reactive创建的响应式对象

会隐式创建一个深度监听器。不管嵌套数据的哪一层发生变化,回调函数都会执行

const person = reactive({
  username: 'jack',
  age: 18,
  sex: '男',
  pet: {
    name: '小花',
    age: 2
  }
})

const change = function () {
  person.pet.name = 'xiaohei'
}

watch(person, (newVal) => {
  console.log('person发生了变化', newVal)
})

// 只监听reactive创建的响应式对象的某个属性呢?==> 改为getter函数的写法(不然就监听person整体)
watch(
  () => person.pet,
  (newVal) => {
    console.log('person发生了变化', newVal)
  },
  { deep: true } 

//当使用 getter 函数作为源时,回调只在此函数的返回值变化时才会触发。如果你想让回调在深层级变更时也能触发,你需要使用 { deep: true } 强制侦听器进入深层级模式。在深层级模式时,如果回调函数由于深层级的变更而被触发,那么新值和旧值将是同一个对象。

总结:reactive监听整体,自动深度监听;监听某个属性需要用getter函数并使用{ deep: true } 进入深度监听

5.监听props

  • watch监听 props 中的基本类型数据,需要通过 getter 函数返回值的形式(()=>props.xxx)才能监听

  • watch监听 props 中的引用类型数据,且父组件中没有改变地址指向时,可以直接监听

  • watch监听 props 中的引用类型数据,且父组件中改变了地址指向时,需要通过 getter 函数返回值的形式(()=>props.xxx)才能监听

获取dom元素

<template>
  <div>
    <div ref="divRef">hello</div>
    <button @click="getDom">点击获取dom元素</button>
    <ul>
      <!-- 如果ref用在v-for上面 这里获取的是dom元素组成的一个数组 -->
      <li v-for="item in 6" :key="item" ref="liRef">{{item}}</li>
    </ul>
  </div>
</template>

<script setup>
import { ref } from 'vue'
// 这里的dom元素获取 这个ref的变量必须和template中的ref的值一致
const divRef = ref(null)
const liRef = ref(null)
const getDom = function () {
  console.log(divRef.value)
  console.log(liRef.value)
}
</script>

获取组件内部的数据

<template>
  <!-- 注意:组件上的ref 在使用了<script setup>的组件时组件内部的东西是私有的 -->
  <!-- 如果想要使用通过组件defineExpose向外暴露数据 -->
  <TestView ref="testRef"></TestView>
  <button @click="getDom">点击获取dom元素</button>
</template>

<script setup>
import { ref } from 'vue'
import TestView from './TestView.vue'
// 这里的dom元素获取 这个ref的变量必须和template中的ref的值一致
const testRef = ref(null)
const getDom = function () {
  console.log(testRef.value.num)
  testRef.value.add(2)
}
</script>
    <!-- 组件 -->
<template>
  <div>
    <div>{{num}}</div>
  </div>
</template>

<script setup>
import { ref } from 'vue'
const num = ref(0)
const add = (n) => {
  num.value += n
}
// 向外暴露数据
defineExpose({
  num,
  add
})
</script>

父子通信

<!-- 父组件 -->
<template>
  <div>
    father 有{{money}}元 儿子考了{{sonScore}}分
    <SonView :Fathermoney="money" @tellFather="getScore"></SonView>
  </div>
</template>

<script setup>
import SonView from './SonView.vue'
import { ref } from 'vue'
const money = ref(100)
const sonScore = ref('???')
const getScore = (score) => {
  sonScore.value = score
}
</script>


<!-- 子组件 -->
<template>
  <div>
    son 有父亲的{{Fathermoney}}元
    <button @click="getProps">通过js获取props</button>
    <button @click="handelscore">点击告诉父亲分数{{score}}</button>
  </div>
</template>

<script setup>
import { ref } from 'vue'
// 子组件中,使用defineProps定义props
// defineProps(['Fathermoney'])
// 如果想要通过js获取属性值 需要一个返回值来接收属性值
// 注意这里是返回值是只读属性 不能修改
const props = defineProps({
  Fathermoney: {
    type: Number,
    default: 0
  }
})

const getProps = () => {
  console.log('通过js获取props', props.Fathermoney)
}
// 子组件中,使用defineEmit定义emit
const emit = defineEmits(['tellFather'])
const score = ref(99)
const handelscore = () => {
  emit('tellFather', score.value)
}
</script>

provide依赖注入数据

<!--父组件也可以是爷爷组件 -->
<script setup>
import { provide } from 'vue'
provide('msg', 'hello world')
</script>

<!--子组件 -->
<template>
  <div>
    <div>{{msg}}</div>
  </div>
</template>

<script setup>
import { inject } from 'vue'
// 使用inject获取provide的提供的数据
const msg = inject('msg')
</script>

V-model语法糖

方法一:

  1. 将内部原生 元素的 value attribute 绑定到 modelValue prop
  2. 当原生的 input 事件触发时,触发一个携带了新值的 update:modelValue 自定义事件
 <!-- App组件 -->
<script setup>
import { ref } from 'vue'
import VmodelView from './components/VmodelView.vue'
const searchText = ref('sss')
</script>
<template>
  <VmodelView v-model="searchText"></VmodelView>
  <!-- 上面的写法是下面的这种写法的语法糖 -->
  <VmodelView :model-value="searchText" @update:model-value="newV=>searchText=newV">
  </VmodelView>
</template>

  <!-- VmodelView组件 -->
<template>
  <div>
    <input type="text" placeholder="请输入内容" @input="handleinput" :value="modelValue">
  </div>
</template>

<script setup>
defineProps({
  // 定义modelValue属性 默认固定的 不能乱写
  modelValue: {
    type: String,
    default: ''
  }
})
// 发送事件的名称也是固定的 不能乱写
const emit = defineEmits(['update:modelValue'])
const handleinput = (e) => {
  emit('update:modelValue', e.target.value)
}
</script>

<style lang="scss" scoped>

</style>

方法二:

使用一个可写的,同时具有 getter 和 setter 的 computed 属性。get 方法需返回 modelValue prop,而 set 方法需触发相应的事件

<!-- CustomInput.vue -->
<script setup>
import { computed } from 'vue'

const props = defineProps(['modelValue'])
const emit = defineEmits(['update:modelValue'])

const value = computed({
  get() {
    return props.modelValue
  },
  set(value) {
    emit('update:modelValue', value)
  }
})
</script>

<template>
  <input v-model="value" />
</template>

多个v-model的绑定:

import VmodelMany from './components/VmodelMany.vue'
const username = ref('admin')
const pwd = ref('123456')
<VmodelMany v-model:username="username" v-model:pwd="pwd"></VmodelMany>


 <input type="text" :value="username" placeholder="用户名" @input="handleusername">
 <input type="text" :value="pwd" placeholder="密码" @input="handlepwd">
 // 多个v-model的写法
defineProps({
  username: {
    type: String,
    default: ''
  },
  pwd: {
    type: String,
    default: ''
  }
})
const emit = defineEmits(['update:username', 'update:pwd'])
const handleusername = (e) => {
  emit('update:username', e.target.value)
}
const handlepwd = (e) => {
  emit('update:pwd', e.target.value)
}

自定义指令

<template>
  <div>
    <h2>DirectiveView</h2>
    <input type="text" v-focus>
  </div>
</template>

<script setup>
// 自定义指令 通过一个对象创建这个对象必须是以v开头
const vFocus = {
  // 指令的钩子函数
  mounted (el) {
    el.focus()
  }
}
</script>

组合式函数

我们想在多个组件中复用这个相同的逻辑 我们可以把这个逻辑以一个组合式函数的形式提取到外部文件中:

// mouse.js
import { ref, onMounted, onUnmounted } from 'vue'

// 按照惯例,组合式函数名以“use”开头
export function useMouse() {
  // 被组合式函数封装和管理的状态
  const x = ref(0)
  const y = ref(0)

  // 组合式函数可以随时更改其状态。
  function update(event) {
    x.value = event.pageX
    y.value = event.pageY
  }

  // 一个组合式函数也可以挂靠在所属组件的生命周期上
  // 来启动和卸载副作用
  onMounted(() => window.addEventListener('mousemove', update))
  onUnmounted(() => window.removeEventListener('mousemove', update))

  // 通过返回值暴露所管理的状态
  return { x, y }
}

下面是它在组件中使用的方式:

<script setup>
import { useMouse } from './mouse.js'

const { x, y } = useMouse()
</script>

<template>Mouse position is at: {{ x }}, {{ y }}</template>

更多详情可见:https://vuejs.org/

码字不易,望各位未来大牛点赞支持一波~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【细节】Vue3基本使用笔记 的相关文章

  • 在 config() 模块中注入依赖项 - AngularJS

    目前在 app js 中我有以下路线 var gm angular module gm gm services gm directives gm filters gm controllers ngSanitize gm config rou
  • 循环选项在 youtube js api 中不起作用

    我想知道为什么我的代码不循环播放视频 除了循环选项之外 一切正常 我真的需要它 多谢 div You need Flash player 8 and JavaScript enabled to view this video div
  • 通过 declarativeNetRequest + extensionPath 重定向时获取原始 URL

    我需要在导航时但在用户从使用设置的规则重定向之前获取 chrome 选项卡的 urldeclarativeNetRequest 目前 用户可以使用上下文菜单添加规则 当尝试访问过滤的主机时 它将被重定向到内部扩展页面 chrome cont
  • 如何根据D3中的数据创建元素?

    看着sample https github com mbostock d3 wiki Selections wiki data d3 select body selectAll div data 4 8 15 16 23 42 enter
  • 将nodejs Express静态请求重定向到https

    我需要将所有 http 请求重定向到 https 包括对静态文件的请求 My code app use express static dirname public app get function req res if req secure
  • 将相同的多个对象推送到多个数组中

    这是后续使3个数组相互对应 第一个是对象名称 https stackoverflow com questions 57564488 make 3 arrays correspond to each other with the first
  • 如何避免多系列折线图d3.js的工具提示重叠

    我已经在多系列折线图上创建了工具提示 如下所示在这里回答 https stackoverflow com questions 34886070 d3 js multiseries line chart with mouseover tool
  • Safari 不触发表单提交

    对于一个项目 我有两个选择表单字段 它们通过 jquery 触发器 提交 发送 这在 Firefox 和 Chrome 中运行良好 但在 Safari 中没有任何反应 这是 HTML 代码
  • Socket.io 如何判断某人何时离开

    我正在使用 socket io 创建一个实时游戏 目前 当有人离开时 什么也不会发生 我想以某种方式通知服务器说谁离开了 有没有办法在用户离开时发出正确的信息 我可以让服务器每 1000 毫秒对每个人执行一次 ping 操作 或者通过其他方
  • 如何在 的每四个循环项之后添加

    我想在循环中的每第四个数字项之后退出循环 我想创建一个二十人的名单 在每一个tr应该是4个人 So I want to break from the loop after every 4th number of loop My one tr
  • 如何将毫秒转换为可读的日期?

    下列 new Date 1324339200000 toUTCString Outputs Tue 20 Dec 2011 00 00 00 GMT 我需要它返回Dec 20 除了我可以使用的更好的方法之外toUTCString 我正在寻找
  • 优化重叠矩形的绘制

    我有很多矩形 有些与其他矩形重叠 每个矩形都有一个绝对 z 顺序和一个colour 每个 矩形 实际上是粒子效果 网格或纹理的轴对齐边界框 并且可能是半透明的 但只要您不尝试剔除其他矩形后面的矩形 就更容易抽象地思考彩色矩形 所以我将在问题
  • 检测 JavaScript 版本

    如何检测浏览器支持的 JavaScript 版本 如果有 我想检查 ECMAScript 3 ECMAScript 5 和 ECMAScript 6 注意 我想避免已弃用的language tag 这里有一个很好的参考给你 http www
  • Android键盘点击搜索输入时出现和消失

    我在用谷歌地图 Js API当我搜索一个地方时 我的输入搜索栏工作正常 当我通过 iPhone 设备使用它时 它也工作得很好 但是当我通过Android 设备然后键盘立即出现和消失 我已经找到了一些关于当我按下搜索栏时 android 键盘
  • React-Router v5 History.push 不触发组件

    很抱歉朋友们又问这个问题了 我找到了解决这个问题的几个方法 但他们让我很困惑 我只是想问一个优雅的方法来做到这一点 正如你通过标题所理解的 我有一个关于反应路由的问题 让我解释 我有一个按钮 其名称是Login 单击按钮后 我执行了一些逻辑
  • 节省页面加载时间的提示[重复]

    这个问题在这里已经有答案了 我的问题 削减那些不必要的 kb 并使页面加载速度更快的最佳方法是什么 全部是什么优化实践 编码实践 在js php中 如果执行可以使您的页面更轻 为什么我问这个 我读了这篇关于 jquery js 与 jque
  • setTimeout() 的问题

    这是我的代码 我想要它做的是写 0 等待一秒 写 1 等待一秒 写 2 等待一秒 等等 而是写 5 5 5 5 5 for i 0 i lt 5 i setTimeout document write i 1000 http jsfiddl
  • 同源政策目的可疑

    正如我所读到的 同源策略是防止源自 邪恶 域 A 的脚本向 良好 域 B 发出请求 换句话说 跨站点请求伪造 玩了一下我了解到的Access Control Allow Origin标头和CORS据我了解 它允许从好域 B 指定服务器 域
  • 以特定顺序运行具有效果的 jQuery 函数

    我在 javascript 函数中有一些 jQuery 可以更改页面上的文本并以特定的时间间隔淡入和淡出 我希望这些函数在每个函数完成其效果后按顺序运行 dialogueExchange1 dialogueExchange2 dialogu
  • 对于调用另一个异步函数的异步函数,玩笑测试失败

    我正在尝试测试一个使用另一个异步函数返回的数据的异步函数 这是解释我的问题的代码 StudentInfo js export async function getData studentData imported from another

随机推荐

  • shell文件通配符(9):任意一个:?、任意数量:*、任意包含[]、[^]:任意不包含

    文章目录 一 有哪些文件通配符 二 匹配任意 匹配任意一个字符 匹配任意数量的字符串 三 匹配任意指定一个字符 1 匹配任意包含 匹配任意包含 字符范围 2 与 匹配任意不包含 四 注意事项 1 通配符组合 2 不能跨越目录层级进行通配 3
  • 云呐工单管理对售后服务的全流程进行精细化的管理

    伴随着市场环境的改变 服务管理已融入到各个行业并起着愈来愈重要的功用 成为企业提升产品附加值 施行差异化发展战略 继而获取核心竞争力的较佳方式 带来良好的服务管理有利于企业获取报告信息 减低顾客流失率和赢得更多新顾客 能够促进企业利润的稳步
  • html文字浮动效果,css浮动怎么理解?

    浮动的意义 设置了浮动属性的元素会脱离普通标准流的控制 移动到其父元素中指定的位置的过程 将块级元素放在一行 浮动会脱离标准流 不占位置 会影响标准流 浮动只有左右浮动 不会出现上下浮动 浮动的使用 基本语法格式 选择器 float 属性值
  • pycharm注释快捷键(多行注释快捷键,三引号注释快捷键...)

    一 前言 相信学习python的小伙伴们对pycharm这款软件并不陌生 有时候我们需要在pycharm里面进行批量注释 但是直接一个一个输入注释符号太麻烦了 下面教大家用快捷键进行注释 二 教程 1 多行 单行注释 import torc
  • element 表格内显示图片

    element 表格内显示图片 先看下效果图 如下 再看下前端代码
  • 时间序列分析教程(二):移动平均与指数平滑

    之前介绍了时间序列的基本概念和性质 现在就正式介绍一些处理时间序列的模型方法 第一个是移动平均法 移动平均法很简单 就是用最近的数据预测未来短时间内的数据 有简单移动平均法 真的很简单 就是用最近的一组数据 去平均 作为下一时刻的预测 S
  • C++ 大话设计之《迭代器模式》(优缺点,设计原理,常用场景)

    迭代器模式是一种行为型模式 优点 它支持以不同的方式遍历一个聚合对象 而无需暴露它的内部表示 迭代器简化了聚合类 在迭代器模式中 由于引入了抽象层 增加新的聚合类和迭代器类都很方便 无需修改原有代码 缺点 由于多了一个抽象层 会增加系统的复
  • JVM中即时编译器JIT与解释器并存-深入理解jvm

    一 学习目标 1 了解解释器与编译器的概念与作用 2 知道jvm中三种执行模式 3 了解热点代码 二 解释器模式与编译器模式以及混合模式 字节码文件通过类装载器装载 被分配被分配到JVM的运行时数据区 然后会被执行引擎执行 执行引擎以指令为
  • Docker部署开源项目Django-CMS企业内容管理系统

    Docker部署开源项目Django CMS企业内容管理系统 一 Django CMS介绍 1 1 Django CMS简介 1 2 Django CMS特点 二 本地环境介绍 2 1 本地环境规划 2 2 本次实践介绍 三 本地环境检查
  • open3d 最远距离采样FPS

    关键代码 FPS pcd down pcd farthest point down sample 1000 pcd CloudPoint 如果是mesh采样 不是FPS pcl mesh sample points poisson disk
  • 骑马与砍杀服务器修复,骑马与砍杀21.3.1公共版和热修说明 修复联机模式

    骑马与砍杀21 3 1公共版和热修说明 修复联机模式 北京时间5月9日 骑马与砍杀2霸主发布了最新更新 以下是更新日志说明 公共版 版本 Native e1 3 1 SandboxCore e1 3 1 Sandbox e1 3 1 Sto
  • eclipse创建第一个JSP项目

    前言 本文的内容由四个部分组成 分别为 Tomcat的安装与配置 创建第一个JSP项目 打包JSP项目到Tomcat服务器上并在浏览器中运行 eclipse的一些java Web的一些设置 1 Tomcat安装与配置 到Tomcat官网下载
  • 【WiFi】wifi芯片架构与原理说明

    目录 1 概述 2 芯片架构 3 工作原理 4 总结 1 概述 WiFi芯片是一种用于无线网络通信的集成电路 它负责将数据转换为无线信号并进行传输 下面是关于WiFi芯片架构和原理的简要说明 2 芯片架构 芯片架构 WiFi芯片通常由以下几
  • ENet分割笔记

    https github com cswhshi segmentation blob master ENet py 权重1 21m 但是内存占用较大 2080ti上batch size为8 coding utf 8 import torch
  • 菜鸟学习历程【17】进程控制编程

    进程控制编程 进程 进程是一个具有一定独立功能的程序的一次运行活动 同时也是资源分配的最小单元 进程 程序 程序执行的实例 放到磁盘的可执行文件 进程不可在计算机之间迁移 程序通常对应着文件 静态和可以复制 动态 静态 暂时 进程是一个状态
  • Unity Transparent Video

    https medium com pofu lu unity transparent video E7 94 A8 videoplayer E6 88 96 avpro E6 92 AD E6 94 BE E9 80 8F E6 98 8E
  • 增量式爬虫

    增量式爬虫 增量式爬虫项目 1 新建爬虫项目 2 配置setting py文件 3 创建爬虫文件 3 1 新建爬虫文件的时候将命令换成 3 2 确定要爬取的网页的url 爬取读书网信息 查找url规律 查看底部的导航栏 右键检查元素 不能确
  • protobuf生成golang和grpc代码踩坑记

    错误提示 seems to be defined in proto which is not imported by proto To use it here please add the necessary import 这个地方主要是因
  • 计算机度分秒在线,角度计算器度分秒在线

    角度计算器度分秒在线是一款数学公式计算器软件 对于想要找到正确的答案 计算器可以直接帮助你 你只需要按照要求输入对应的数字 计算器就会帮你准确快速的算出答案 现在手机app下载就能长期免费使用 角度计算器度分秒在线使用说明 输入一 此输入必
  • 【细节】Vue3基本使用笔记

    vite 文档 https cn vitejs dev guide 安装 使用 NPM npm create vite latest 使用 Yarn yarn create vite 使用 PNPM pnpm create vite 选择项