vue3到vue2组件重构方法笔记

news2024/11/27 14:44:57

这两天的任务是把一批做好的vue3组件放在vue2项目中使用,将组合式api分散开有一些零散的技巧,所以写一篇转化笔记以供大家参考

先上vue3一个组件的示例代码

<template>
  <div ref="GForms" :style="{background: props.background, border: '1px solid ' + props.borderColor, 'backdrop-filter': props.backBlur? 'blur(10px)': 'blur(0px)'}" style="min-width: 200px; min-height: 60px; padding: 0; margin: 0; position: relative; transition: width .8s, height .8s;">
    <!-- 四个角 -->
    <div v-if="!props.corner" :style="{background: props.cornerColor}" style="position: absolute; left: -1px; top: -1px; width: calc(100% + 2px); height: 2px;"></div>
    <div v-if="props.corner" style="position: absolute; left: -1px; top: -1px; transform: rotateZ(0deg);">
      <div :style="{background: props.cornerColor}" style="width: 6px; height: 2px; position: absolute;"></div>
      <div :style="{background: props.cornerColor}" style="width: 6px; height: 2px; position: absolute; transform: rotateZ(90deg); left: -2px; top: 2px;"></div>
    </div>
    <div style="position: absolute; left: -1px; bottom: -1px; transform: rotateZ(270deg);">
      <div :style="{background: props.cornerColor}" style="width: 6px; height: 2px; position: absolute;"></div>
      <div :style="{background: props.cornerColor}" style="width: 6px; height: 2px; position: absolute; transform: rotateZ(90deg); left: -2px; top: 2px;"></div>
    </div>
    <div v-if="props.corner" style="position: absolute; right: -1px; top: -1px; transform: rotateZ(90deg);">
      <div :style="{background: props.cornerColor}" style="width: 6px; height: 2px; position: absolute;"></div>
      <div :style="{background: props.cornerColor}" style="width: 6px; height: 2px; position: absolute; transform: rotateZ(90deg); left: -2px; top: 2px;"></div>
    </div>
    <div style="position: absolute; right: -1px; bottom: -1px; transform: rotateZ(-180deg);">
      <div :style="{background: props.cornerColor}" style="width: 6px; height: 2px; position: absolute;"></div>
      <div :style="{background: props.cornerColor}" style="width: 6px; height: 2px; position: absolute; transform: rotateZ(90deg); left: -2px; top: 2px;"></div>
    </div>
    <!-- 标题栏 @mouseup="gFormsMouseup" @mousemove="gFormsMousemove"-->
    <div v-if="props.showTitle" @mousedown="gFormsMousedown" :style="{cursor: props.move? 'move': 'default'}" style="user-select: none; padding: 4px 6px; display: flex; flex-direction: row; flex-wrap: nowrap; justify-content: space-between; align-items: center;">
      <div style="margin-top: 2px; display: flex; flex-direction: row; flex-wrap: nowrap; align-items: center;">
        <div style="font-size: 16px; font-weight: bold; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;">{{props.title}}</div>
        <img :src="data.icon" alt="logo" style="margin: -3px 0 0 3px;"/>
      </div>
      <div @click.stop="gFormsCloseWindows" class="g-forms-close-btn" style="position: relative; width: 22px; height: 22px;">
        <div class="g-forms-close-btn-bg" style="position: relative; width: 20px; height: 20px; margin: 1px;">
          <div style="position: absolute; width: 14px; height: 2px; transform: rotateZ(45deg); transform-origin: center 50%; background: #fff; top: 9px; left: 3px;"></div>
          <div style="position: absolute; width: 14px; height: 2px; transform: rotateZ(-45deg); transform-origin: center 50%; background: #fff; top: 9px; left: 3px;"></div>
        </div>
        <div style="position: absolute; left: -1px; top: -1px; width: 2px; height: 2px; background: #fff;"></div>
        <div style="position: absolute; left: -1px; bottom: -1px; width: 2px; height: 2px; background: #fff;"></div>
        <div style="position: absolute; right: -1px; top: -1px; width: 2px; height: 2px; background: #fff;"></div>
        <div style="position: absolute; right: -1px; bottom: -1px; width: 2px; height: 2px; background: #fff;"></div>
      </div>
    </div>
    <!-- 分割条 -->
    <div v-if="props.showTitle" style="display: flex; flex-direction: row; flex-wrap: nowrap; align-items: center; padding: 0 4px;">
      <div style="width: 90%; background: #4F728E; height: 3px;"></div>
      <div style="width: 10%; background: #DEE3E9; height: 3px; margin-left: 2px;"></div>
    </div>
    <slot></slot>
  </div>
</template>

<script lang="ts" setup>
// 边框
import { defineProps, reactive, defineEmits, ref, onMounted } from 'vue'

const props = defineProps({
  title: { type: String, default: "G-Forms" }, // 窗口标题
  showTitle: { type: Boolean, default: true }, // 显示标题
  move: { type: Boolean, default: true }, // 是否可以移动
  inArea: { type: Boolean, default: true }, // 是否在区域内移动
  corner: { type: Boolean, default: true }, // 四个角是否为尖角
  cornerColor: { type: String, default: "#FFF" }, // 四角装饰颜色
  backBlur: { type: Boolean, default: true }, // 开启背景模糊
  background: { type: String, default: "#001820ab" }, // 背景颜色
  borderColor: { type: String, default: "#2F739A" }, // 边框线条颜色
})

const GForms = ref<HTMLElement | null>()
let gflag = ref(false)
const data = reactive({
  icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACUAAAAZCAYAAAC2JufVAAABYElEQVRIx2P4//8/w2DDDKOOGnXUiHKUqW/cAyD+j4Qb5m478QCI/yPhBkrU/b/k+wCI/yPhBkKOckAz5H/5hEUpaJb9jy5uSSFX3bZFwSlojgJhA7zRB9Q4Ac2gC0ALJqBZeIESdUBHTEBz1AVCjhJAD3bHyKwO9OiZuGpPB7nqfGNjOghFI0Z8DoZoxJr6BzoacTlqQKMRZ1kB1JiAHuxACxLQo4cSdUBHJGBEI4GQ+oBsgFN0TiXQ8A/IFk1YsauSXHX+cTGVQEd8QHNUAT5HHUDz1Qag4QfQfL+BEnVABxxAc9AGfLmvAc2AB9M3HOpAs+iBdXBKB7nqPp/y60BzEChtCeAqpwLQDPhQN31lIZpFH0JyagvJVXdkdVAhmoM+oJfqyA5SQI/3oKzqEvT00TBzdQm56nKKIkuwpKMEfHXfBTRfLQCVMWi+X0CJOnBZhOqgBaPtqVFHjVhHAQDOW7xzUODHCgAAAABJRU5ErkJggg==",
  // 鼠标位置
  gfMX: 0,
  gfMY: 0,
  // 偏移量
  deltaX: 0,
  deltaY: 0,
  // 页面尺寸
  pageW: 0,
  pageH: 0
})

const emit = defineEmits(['close'])

onMounted(() => {
  data.pageW = window.innerWidth
  data.pageH = window.innerHeight
  window.onresize = () => {
    data.pageW = window.innerWidth
    data.pageH = window.innerHeight
  }
  if (data.deltaX != 0 || data.deltaY != 0) setPosition()
})

// 设置窗体位置
const setPosition = () => setTimeout(() => {
  if (GForms.value == null || GForms.value == undefined) return;
  if (props.inArea) {
    if (data.deltaX < 1) data.deltaX = 1
    if (data.deltaY < 80) data.deltaY = 80
    if (data.deltaX + GForms.value?.offsetWidth > data.pageW) data.deltaX = data.pageW - GForms.value?.offsetWidth
    if (data.deltaY + GForms.value?.offsetHeight > data.pageH) data.deltaY = data.pageH - GForms.value?.offsetHeight
  }
  GForms.value.style.top = data.deltaY + "px"
  GForms.value.style.left = data.deltaX + "px"
}, 0)

// 关闭方法
const gFormsCloseWindows = () => {
  emit('close')
}
// 窗体移动方法
const gFormsMousedown = (e:any) => {
  if (!props.move) return

  gflag.value = true
  data.gfMX = e.offsetX
  data.gfMY = e.offsetY
  // 防抖
  if (data.deltaX != 0 || data.deltaY != 0) setPosition()
  // 移动过程
  document.onmousemove = (e: any) => {
    if (!gflag.value) return;
    data.deltaX = e.clientX - data.gfMX
    data.deltaY = e.clientY - data.gfMY
    setPosition()
  }
  // 鼠标抬起
  document.onmouseup = (e: any) => {
    setPosition()
    gflag.value = false
    document.onmousemove = null
    document.onmouseup = null
  }
}


</script>

<style scoped>

.g-forms-close-btn-bg {
  background: #2E454C;
}
.g-forms-close-btn:hover .g-forms-close-btn-bg {
  background: #4b96a3;
  cursor: pointer;
}
.g-forms-close-btn:active .g-forms-close-btn-bg {
  background: #2E454C;
  cursor: pointer;
}

.div-l-shape-s {
  border-style: solid;
  border-width: 0 0 3px 3px;
  position: relative;
  right: -3px;
  top: -3px;
  background: white;
  width: 4em;
  height: 4em;
}
</style>

上面是其中一个vue3组件样式表,在vue3的项目中展示效果为下图所示:
在这里插入图片描述
组件中还有一些其他的功能都要完整保留,所以现在开始整理:

要将 Vue 3 组件转换为 Vue 2 组件,需要注意一些语法和功能上的差异。下面是我总结的 Vue 3 组件转换为 Vue 2 组件的一般步骤:
1、首先是template里的内容,可以看到在vue3模板里使用属性要这么写:

:style="{background: props.background}" //取出在props里面的值

在 Vue 3 中,使用 props 选项来声明组件的属性,而Vue 3 中的 props 默认是不响应式的,所以可以看到代码中套了一层defineProps方法,defineProps 方法是 Vue 3 中用于声明组件属性的函数。它的作用是定义组件接收的属性,并使其在组件内部成为响应式的。

而在vue2中可以直接使用props里面的值,语法为下面代码:

:style="{background: background}"
export default {
props: {
      title: { type: String, default: "G-Forms" }, // 窗口标题
      showTitle: { type: Boolean, default: true }, // 显示标题
      move: { type: Boolean, default: true }, // 是否可以移动
      inArea: { type: Boolean, default: true }, // 是否在区域内移动
      corner: { type: Boolean, default: true }, // 四个角是否为尖角
      cornerColor: { type: String, default: "#FFF" }, // 四角装饰颜色
      backBlur: { type: Boolean, default: true }, // 开启背景模糊
      background: { type: String, default: "#001820ab" }, // 背景颜色
      borderColor: { type: String, default: "#2F739A" }, // 边框线条颜色
    },
}

因为里面的数据都是可以直接使用的

2、在vue2中要去掉<script lang="ts" setup>里面的lang="ts" setup
书写vue2中的逻辑
删掉import { defineProps, reactive, defineEmits, ref, onMounted } from 'vue'这类语句因为不需要

3、在vue3中,data的书写方式为下面代码:

const data = reactive({
  icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACUAAAAZCAYAAAC2JufVAAABYElEQVRIx2P4//8/w2DDDKOOGnXUiHKUqW/cAyD+j4Qb5m478QCI/yPhBkrU/b/k+wCI/yPhBkKOckAz5H/5hEUpaJb9jy5uSSFX3bZFwSlojgJhA7zRB9Q4Ac2gC0ALJqBZeIESdUBHTEBz1AVCjhJAD3bHyKwO9OiZuGpPB7nqfGNjOghFI0Z8DoZoxJr6BzoacTlqQKMRZ1kB1JiAHuxACxLQo4cSdUBHJGBEI4GQ+oBsgFN0TiXQ8A/IFk1YsauSXHX+cTGVQEd8QHNUAT5HHUDz1Qag4QfQfL+BEnVABxxAc9AGfLmvAc2AB9M3HOpAs+iBdXBKB7nqPp/y60BzEChtCeAqpwLQDPhQN31lIZpFH0JyagvJVXdkdVAhmoM+oJfqyA5SQI/3oKzqEvT00TBzdQm56nKKIkuwpKMEfHXfBTRfLQCVMWi+X0CJOnBZhOqgBaPtqVFHjVhHAQDOW7xzUODHCgAAAABJRU5ErkJggg==",
  // 鼠标位置
  gfMX: 0,
  gfMY: 0,
  // 偏移量
  deltaX: 0,
  deltaY: 0,
  // 页面尺寸
  pageW: 0,
  pageH: 0
})

但是在vue2中

data() {
      return {
        icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACUAAAAZCAYAAAC2JufVAAABYElEQVRIx2P4//8/w2DDDKOOGnXUiHKUqW/cAyD+j4Qb5m478QCI/yPhBkrU/b/k+wCI/yPhBkKOckAz5H/5hEUpaJb9jy5uSSFX3bZFwSlojgJhA7zRB9Q4Ac2gC0ALJqBZeIESdUBHTEBz1AVCjhJAD3bHyKwO9OiZuGpPB7nqfGNjOghFI0Z8DoZoxJr6BzoacTlqQKMRZ1kB1JiAHuxACxLQo4cSdUBHJGBEI4GQ+oBsgFN0TiXQ8A/IFk1YsauSXHX+cTGVQEd8QHNUAT5HHUDz1Qag4QfQfL+BEnVABxxAc9AGfLmvAc2AB9M3HOpAs+iBdXBKB7nqPp/y60BzEChtCeAqpwLQDPhQN31lIZpFH0JyagvJVXdkdVAhmoM+oJfqyA5SQI/3oKzqEvT00TBzdQm56nKKIkuwpKMEfHXfBTRfLQCVMWi+X0CJOnBZhOqgBaPtqVFHjVhHAQDOW7xzUODHCgAAAABJRU5ErkJggg==",
        // 鼠标位置
        gfMX: 0,
        gfMY: 0,
        // 偏移量
        deltaX: 0,
        deltaY: 0,
        // 页面尺寸
        pageW: 0,
        pageH: 0,
        gflag:false,
        GFormsRef:0,
        gFormsMouseup: false,
      };
    },

利用函数式的data存放数据

4、const GForms = ref<HTMLElement | null>()
这是vue3组件中的一句代码,这句话的意思是创建一个响应式引用(ref),其初始值为 null,类型为 HTMLElement 或 null。

在 Vue 3 中,ref 是一个用于创建响应式数据的函数。它接受一个初始值作为参数,并返回一个包含 .value 属性的响应式引用对象。.value 属性用于访问和修改引用的值。当引用的值发生变化时,相关的组件会自动重新渲染。

在上述代码中,GForms 是一个名为 GForms 的变量,它是一个响应式引用。我们可以使用 GForms.value 来访问和修改它的值。在初始状态下,GForms.value 的值为 null。可以通过将其赋值为一个 HTMLElement 对象来将其引用到特定的 DOM 元素。

通过使用 ref 创建的响应式引用,可以轻松地追踪和响应 DOM 元素的变化,并在 Vue 3 组件中进行操作。

而在vue2中,这句话要被拆分为几部分
1、在组件的 data 选项中定义一个名为 GForms 的属性,并将其初始值设置为 null。例如:

data() {
  return {
    GForms: null,
  };
},

2、在模板中使用 ref 属性将 GForms 和相应的 DOM 元素进行绑定。例如:

<div ref="GForms">...</div>

3、在组件的生命周期钩子函数(例如 mounted)中,使用 $refs 来访问 GForms 引用的 DOM 元素,并将其赋值给组件的 GForms 属性。例如:

mounted() {
  this.GForms = this.$refs.GForms;
},

在这样的转换后,您可以在组件中使用 this.GForms 来访问和操作引用的 DOM 元素。

4、vue3传值

const emit = defineEmits(['close'])

在Vue 3中,const emit = defineEmits(['close'])这句话的作用是定义一个名为emit的常量,它使用defineEmits函数来声明组件的自定义事件。

defineEmits是Vue 3中的一个全局辅助函数,用于声明组件可以触发的自定义事件。通过传递一个字符串数组,你可以定义组件可以发出的事件名称。

在我的例子中,['close']是一个包含单个字符串'close'的数组,它表示组件可以触发名为'close'的自定义事件。通过使用defineEmits(['close']),可以确保组件在使用$emit方法触发’close’事件时,不会产生警告。

在组件中,可以使用emit常量来触发声明的自定义事件,例如:

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

const emit = defineEmits(['close']);

export default {
  methods: {
    handleClose() {
      // 触发 'close' 事件
      emit('close');
    },
  },
};
</script>

在上述代码中,handleClose方法通过调用emit('close')来触发’close’事件。这样,其他使用这个组件的地方可以监听该事件并执行相应的逻辑。
在我的代码中:

 <div @click.stop="gFormsCloseWindows"/>

点击触发gFormsCloseWindows函数,

const gFormsCloseWindows = () => {
  emit('close')
}

这样的话就可以在组件外的父组件上进行接收close,
在app组件中

@close="handleClose"

之后在data中定义

  data() {
    return {
      showChildComponent: true
    };
  },

在methods中定义

methods: {
    handleClose() {
      // 执行关闭操作
      this.showChildComponent = false;
    }
  }

前提是在gForm组件中要预留

v-if="showChildComponent"

就可以实现此功能

5、生命周期转化
在vue3中

onMounted(() => {
  data.pageW = window.innerWidth
  data.pageH = window.innerHeight
  window.onresize = () => {
    data.pageW = window.innerWidth
    data.pageH = window.innerHeight
  }
  if (data.deltaX != 0 || data.deltaY != 0) setPosition()
})

而在vue2中进行相应的转化

mounted() {
      this.pageW = window.innerWidth;
      this.pageH = window.innerHeight;
      window.onresize = () => {
        this.pageW = window.innerWidth;
        this.pageH = window.innerHeight;
      };
      if (this.deltaX !== 0 || this.deltaY !== 0) {
        this.setPosition();
      }
    },

6、methods转化
vue3代码示例

// 窗体移动方法
const gFormsMousedown = (e:any) => {
  if (!props.move) return

  gflag.value = true
  data.gfMX = e.offsetX
  data.gfMY = e.offsetY
  // 防抖
  if (data.deltaX != 0 || data.deltaY != 0) setPosition()
  // 移动过程
  document.onmousemove = (e: any) => {
    if (!gflag.value) return;
    data.deltaX = e.clientX - data.gfMX
    data.deltaY = e.clientY - data.gfMY
    setPosition()
  }
  // 鼠标抬起
  document.onmouseup = (e: any) => {
    setPosition()
    gflag.value = false
    document.onmousemove = null
    document.onmouseup = null
  }
}

转化为vue2

methods: {
      gFormsCloseWindows() {
        this.$emit('close');
      },
      // 设置窗体位置
        setPosition() {
          const GFormsRef = this.$refs.GForms;
            setTimeout(() => {
              if (this.GFormsRef == null || this.GFormsRef == undefined) return;
              // 在判断时应该使用 this.GFormsRef,而不是 this.GForms

              if (this.inArea) {
                if (this.deltaX < 1) this.deltaX = 1;
                if (this.deltaY < 1) this.deltaY = 1;
                if (this.deltaX + this.GFormsRef.offsetWidth > this.pageW) {
                  this.deltaX = this.pageW - this.GFormsRef.offsetWidth;
                }
                if (this.deltaY + this.GFormsRef.offsetHeight > this.pageH) {
                  this.deltaY = this.pageH - this.GFormsRef.offsetHeight;
                }
              }

              GFormsRef.style.top = this.deltaY-60 + "px";
              GFormsRef.style.left = this.deltaX + "px";
              // 注意使用 this.GFormsRef.style 来设置元素的样式,而不是 this.GForms.style
            },0);
          },

          // 窗体移动方法
          gFormsMousedown(e) {
            if (!this.move) return;

            this.gflag = true;
            this.gfMX = e.offsetX;
            this.gfMY = e.offsetY;
            // 防抖
            if (this.deltaX !== 0 || this.deltaY !== 0) {
              this.setPosition();
            }
            // 移动过程
            document.onmousemove = (e) => {
              if (!this.gflag) return;
              // console.log(e.clientX);
              // console.log(e.clientY);
              // e.clientX表示鼠标当前的水平坐标
              this.deltaX = e.clientX - this.gfMX;
              this.deltaY = e.clientY - this.gfMY;
              this.setPosition();
            }
            // 鼠标松开
          },
          handleMouseUp() {
            this.setPosition();
            this.gflag = false;
            document.onmousemove = null;
            document.onmouseup = null;
          }
      },
}

大致就是这些,其实熟悉了之后组件之间相互转化就很快了,希望对大家有所帮助

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

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

相关文章

27 # node 基本概念

node 基本概念 1、node 是什么&#xff1f; node.js 是一个基于 chrome v8 引擎的 JavaScript 运行环境&#xff08;runtime&#xff09;&#xff0c;node 不是一门语言&#xff0c;是让 js 运行在后端的运行时&#xff0c; 并且不包括 JavaScript 全集&#xff0c;因为在服务…

Collections工具类(java)

Collections工具类 java.util.Collections; 是集合的工具类作用&#xff1a;Collections不是集合&#xff0c;而是集合的工具类 Collections常用的API 方法名称说明public static <T> boolean addAll(Collection<T> c,T... elements)批量添加元素public static …

MySQL秘籍:让你的表操作炉火纯青

&#x1f495;每个人都有自己的一生&#xff0c;不要和别人去比较。比较只会让你感到沮丧和不满足。关注自己的成长和进步&#xff0c;并享受属于自己的旅程。 &#x1f495; &#x1f43c;作者&#xff1a;不能再留遗憾了&#x1f43c; &#x1f386;专栏&#xff1a;MySQL学习…

【LeetCode】11,盛最多水的容器。 难度等级:中等。双指针解法值得深入学习。

文章目录 一、题目二、我的解法&#xff1a;双重for循环&#xff0c;超出时间限制三、最优解法&#xff1a;双指针从两侧开始遍历 【LeetCode】11&#xff0c;盛最多水的容器。 难度等级&#xff1a;中等。 一、题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#x…

小米、华为、海尔竞争中,全屋智能「崛起」2023

智能家居进入下半场&#xff0c;互联网大厂凭借着自身的流量红利收割了一部分市场份额&#xff1b;家电企业在向家装企业转型的过程中&#xff0c;也有其自带的流量优势和渠道优势&#xff1b;通信厂商借着“链接”优势&#xff0c;三大阵营在智能家居行业都各占鳌头。 作者|思…

NPM 制作命令行工具 - 进阶辅助库

一、简介 通过 NPM 制作命令行工具 - 入门案例 已经基本知道如何制作命令行工具了&#xff0c;现在就是内部命令处理。 如果不使用第三方插件辅助&#xff0c;那就只能对传入的参数进行一个一个判断处理&#xff0c;添加注释&#xff0c;这是很麻烦的&#xff0c;所以&#xf…

移动端开发之基础知识:视口、三倍图、移动端开发选择、移动端技术解决方案、移动端常见布局

移动端开发之流式布局 移动端基础浏览器现状手机屏幕现状移动端调试方法 视口布局视口视觉视口理想视口总结&#xff1a; meta视口标签标准的viewport设置 三倍图物理像素&物理像素比多倍图背景缩放 background-size背景图三倍图 多倍图切图 cutterman 移动端开发选择移动端…

基于JavaWeb的私人牙科诊所管理系统

目录 1、项目背景 2、项目目标 3、项目功能 4、系统架构 5、项目源码 6、论文目录&#xff08;16000字&#xff09; 1、项目背景 在当前社会医疗水平的高速发展下&#xff0c;口腔方面的医疗在社会上不断发展壮大。私人化牙科诊所呈现蓬勃发展的趋势&#xff0c;各方面的…

【JavaSE】方法的使用--05

目录 一、方法的概念与使用 1.1 什么是方法 1.2 方法的定义 1.3 方法调用的执行过程 1.4 实参和形参的关系&#xff08;重要&#xff09; 1.5 有无返回值的方法 二、方法的重载 2.1 方法重载的概念 2.2 方法重载的要求 2.3 方法签名 前言&#xff1a; 之前很久没写这…

python基础----01-----环境搭建

一 python介绍 1.1 Python 特点 Python 是完全面向对象的语言。函数、模块、数宁、宁符串都是对象&#xff0c;在 Python 中一切皆对象。完全支持继承、重载、多重继承。支持重载运算符&#xff0c;也支持泛型设计。Python 拥有一个强大的标准库&#xff0c;Python 语言的核心…

谷云科技受邀出席2023华南CIO大会-应用与数据集成专家

2023年6月10-11日&#xff0c;我们将于中国珠海国际会展中心迎来第6届 S-CIO 2023华南CIO大会暨信息技术交易会 。大会将邀请近1000位来自广东、广西、福建、海南等地的企业IT高管及行业专家深入探讨企业数字化运营的关键问题&#xff0c;以“ 千人论坛-生态展区-专业分论坛-华…

2023年成人高考标准拿证流程(入学前入学后)

很多小伙伴对成人高考“报名→学习→毕业”的流程还是很陌生哈&#xff0c;下面给大家整理了一份详细的报考流程和攻略。 大家可以收藏起来&#xff0c;仔细看看。 成考全流程—入学前 5月—8月 联系报名机构老师预报名&#xff0c;选定自己要报考院校专业&#xff0c;了解报…

36 KVM管理设备-配置虚拟串口

文章目录 36 KVM管理设备-配置虚拟串口36.1 概述36.2 操作步骤 36 KVM管理设备-配置虚拟串口 36.1 概述 在虚拟化环境下&#xff0c;由于管理和业务的需求&#xff0c;虚拟机与宿主机需要互相通信。但在云管理系统复杂的网络架构下&#xff0c;运行在管理平面的服务与运行在业…

Servlet简介和环境设置

目录 Servlet 简介 Servlet 环境设置 导入jar包 web.xml文件配置 WebServlet注解配置 web.xml文件的方式和WebServlet区别 Servlet 简介 Servlet 是运行在 Web 服务器或应用服务器上的程序&#xff0c;它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上…

对csv文件,又get了新的认知(二)

背景 最近在做数据处理时&#xff0c;发现别人给的 csv 文件用 txt 打开后&#xff0c;发现里面的所有字段都是带双引号&#xff0c;与自己之前见过的 csv 文件有点不一样&#xff0c;自己脑海里面隐约也见过 python 有相关的设置参数&#xff0c;于是就查看 python 官方文档中…

Linux 常用开发工具(上)(yum、vim)知识点+完整思维导图+实图例子+深入细节+通俗易懂建议收藏

绪论 耐心是一切聪明才智的基础。—— 柏拉图。本章进入到Linux下的一些常用的工具&#xff0c;这些工具能帮助我们去更好的使用Linux操作系统。 话不多说安全带系好&#xff0c;发车啦&#xff08;建议电脑观看&#xff09;。 附&#xff1a;红色&#xff0c;部分为重点部分&a…

一个无标记点面捕头盔,如何实现高精度面部表情捕捉?

在影视、动画、 游戏、虚拟直播应用中 虚拟数字人 可以犹如真人般实时驱动 背后少不了面部捕捉技术 随着面部捕捉技术不断革新&#xff0c;从有标记点到无标记点发展&#xff0c;再到如今佩戴一个面捕头盔就可以轻松做到精准面捕。 广州虚拟动力多年沉淀经验&#xff0c;根…

eslint导致的报错解决

当你利用脚手架在创建vue项目时&#xff0c;无脑创建下默认一定会安装eslint代码检测工具。那么你的噩梦就来了。eslint作为代码规范检测&#xff0c;不得不承认它的强大&#xff0c;但是绝对是会逼死一众强迫症患者。 比如你只是简简单单运行一个vue项目&#xff0c;报错一大堆…

10 EM(期望最大)算法

文章目录 10 EM&#xff08;期望最大&#xff09;算法10.1 背景介绍10.2 EM算法公式10.2.1 EM算法公式收敛性证明10.2.2 EM算法公式导出 10.3 广义EM算法10.3.1 EM有什么作用&#xff1f;10.3.2 为什么要引入广义EM&#xff1f;10.3.3 广义EM公式导出10.3.4 广义EM有什么不同 1…

RS-232 RS-485 TTL电平标准 以及串口、COM口、UART口、USB转TTL、USB转串口

串口 即串行通信接口&#xff0c;与之相对应的另一种接口叫并口&#xff0c;并行接口。两者的区别是&#xff0c;传输一个字节&#xff08;8个位&#xff09;的数据时&#xff0c;串口是将8个位排好队&#xff0c;逐个地在1条连接线上传输&#xff0c;而并口则将8个位一字排开…