【三十天精通Vue 3】第十二天 Vue 3 的函数式组件详解(过滤器已废弃)

news2025/1/13 15:55:33

请添加图片描述

✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: 三十天精通 Vue 3

文章目录

    • 引言
    • 一、Vue3 中的函数式组件
      • 1.1 函数式组件的概念和特点
      • 1.2 函数式组件和普通组件的区别
      • 1.3 如何定义和使用函数式组件
    • 二、Vue3 函数式组件的应用场景
      • 2.1 列表渲染
      • 2.2 条件渲染
      • 2.3 表单控件
      • 2.4 路由导航
    • 三、Vue3 函数式组件的高级应用
      • 3.1 Scoped Slots
      • 3.2 组件缓存
      • 3.3 嵌套组件
      • 3.4 Vue3 函数式组件的高级应用 动态组件
    • 四、Vue3 函数式组件的注意事项和常见问题
      • 4.1 子组件如何更新父组件的状态
      • 4.2 函数式组件中如何使用this
      • 4.3 函数式组件中的v-model

引言

函数式组件是 Vue3 中的一个重要概念,它是一种轻量级的组件形式,具有高效、简洁和可复用等优点。在本文中,我们将详细介绍 Vue3 函数式组件的概念、应用场景、高级应用以及注意事项和常见问题。我们还会给出相应的代码示例,帮助读者更好地理解和掌握函数式组件的使用方法。

一、Vue3 中的函数式组件

image-20230421170359640.png

1.1 函数式组件的概念和特点

函数式组件是指没有状态(没有响应式数据)和实例(没有 this 上下文)的组件,它只接受 props 作为输入,并返回渲染结果。函数式组件的定义形式如下:

const MyFunctionalComponent = (props, context) => {
  // 函数式组件的渲染逻辑
}

函数式组件具有以下特点:

  • 函数式组件是纯函数,它不依赖于组件实例的状态,也不会影响组件外部的状态。
  • 函数式组件的渲染结果只由输入的 props 决定,因此具有高效和可预测的特点。
  • 函数式组件的代码量少,结构简单,易于维护和测试。

1.2 函数式组件和普通组件的区别

在 Vue3 中,函数式组件和普通组件有以下区别:

  • 普通组件通过 new Vue() 实例化,而函数式组件通过函数调用实现。
  • 普通组件具有响应式数据和实例上下文,而函数式组件没有。
  • 普通组件具有生命周期钩子函数和状态管理能力,而函数式组件没有。
  • 普通组件支持自定义指令、计算属性和事件处理函数,而函数式组件不支持。

1.3 如何定义和使用函数式组件

定义函数式组件非常简单,只需要将组件的 template 部分替换为一个返回 VNode 的函数即可。例如:

// 函数式组件的定义
const FunctionalComponent = (props, context) => {
  return h('div', `Hello, ${props.name}!`);
};// 函数式组件的使用
<template>
  <FunctionalComponent name="Vue3" />
</template>

上述代码中,我们定义了一个名为 FunctionalComponent 的函数式组件,并将其用作了模板中的子组件。这个组件接收一个名为 name 的 prop,并返回一个包含 Hello, ${props.name}! 内容的 div 元素。使用函数式组件与使用普通组件的方式是一样的,只需要将组件的名称放在模板中即可。

二、Vue3 函数式组件的应用场景

image-20230421170501301.png

2.1 列表渲染

在 Vue 3 中,我们通常使用 v-for 指令来渲染列表。而对于简单的列表项,我们可以使用函数式组件来提高性能。函数式组件相比普通组件的优势在于不需要维护状态,仅仅是一个纯展示组件。因此,对于仅包含静态内容的列表项,我们可以使用函数式组件来提高渲染性能。

下面是一个使用函数式组件渲染简单列表的示例代码:

<template>
  <ul>
    <li v-for="item in items" :key="item.id">
      <ListItem :item="item" />
    </li>
  </ul>
</template><script>
import { defineComponent } from 'vue'
import ListItem from './ListItem.vue'export default defineComponent({
  components: {
    ListItem
  },
  props: {
    items: {
      type: Array,
      required: true
    }
  }
})
</script>

在上述代码中,我们通过 v-for 指令渲染列表,并将每个列表项包装在一个 ListItem 函数式组件中。ListItem 函数式组件不需要维护状态,只需要展示传入的 item 数据即可。

下面是 ListItem 函数式组件的示例代码:

<template functional>
  <div>
    <h2>{{ props.item.title }}</h2>
    <p>{{ props.item.content }}</p>
  </div>
</template>

在上述代码中,我们通过 functional 标识符声明了一个函数式组件。函数式组件的模板只包含一个函数参数 props,通过 props.item 访问传入的列表项数据。

2.2 条件渲染

在 Vue3 中,条件渲染可以通过 v-ifv-show 指令来实现。对于简单的条件渲染,使用普通组件即可满足需求。但对于条件渲染嵌套过深,或需要频繁切换的场景,使用函数式组件可以有效提升性能。

下面是一个使用函数式组件实现条件渲染的示例:

<template>
  <div>
    <button @click="toggleShow">Toggle Show</button>
    <functional-comp :is="show ? 'comp-a' : 'comp-b'" />
  </div>
</template><script>
import CompA from './CompA.vue'
import CompB from './CompB.vue'const FunctionalComp = {
  functional: true,
  render(h, { props }) {
    return h(props.is)
  }
}export default {
  components: {
    CompA,
    CompB,
    FunctionalComp
  },
  data() {
    return {
      show: true
    }
  },
  methods: {
    toggleShow() {
      this.show = !this.show
    }
  }
}
</script>

在上述代码中,我们定义了一个函数式组件 FunctionalComp,它根据传入的 is 属性渲染不同的组件。通过点击按钮,我们可以动态切换 FunctionalComp 中渲染的组件。相比于使用普通组件,使用函数式组件可以减少组件的创建和销毁次数,提升渲染性能。

2.3 表单控件

在表单控件中,使用函数式组件可以避免因组件状态变化而导致的重新渲染,提升性能。

下面是一个使用函数式组件实现表单控件的示例:

<template>
  <div>
    <label>输入框:</label>
    <functional-input :value="value" @input="handleChange" />
    <div>输入的内容是:{{ value }}</div>
  </div>
</template><script>
const FunctionalInput = {
  functional: true,
  render(h, { props, listeners }) {
    return h('input', {
      attrs: { type: 'text' },
      domProps: { value: props.value },
      on: {
        input: listeners.input
      }
    })
  }
}export default {
  components: {
    FunctionalInput
  },
  data() {
    return {
      value: ''
    }
  },
  methods: {
    handleChange(e) {
      this.value = e.target.value
    }
  }
}
</script>

在上述代码中,我们定义了一个函数式组件 FunctionalInput,它接收 value、onUpdate:modelValue、placeholder、disabled 和 type 五个 props,其中 value 和 onUpdate:modelValue 用于实现 v-model 功能,placeholder 用于设置输入框的占位符,disabled 用于控制输入框是否可用,type 用于设置输入框的类型。在组件的 template 中,我们使用 h 函数创建一个 input 元素,并设置其相关属性和事件监听器,最后将其返回。由于这是一个函数式组件,它不会有自己的实例,也不会有响应式的数据,所以我们需要通过 props 将需要的数据传入组件,也需要使用 emit 函数将事件传递给父组件,实现双向绑定的效果。

2.4 路由导航

函数式组件在路由导航中也有着广泛的应用,特别是在需要在页面中嵌入动态路由参数的情况下。以 Vue Router 为例,我们可以在函数式组件中使用 props 属性来获取动态路由参数,进而实现页面的动态渲染。

首先,我们需要在路由配置中定义动态路由参数:

{
  path: '/user/:id',
  component: User,
  props: true
}

在上面的例子中,我们定义了一个名为 id 的动态路由参数,该参数将传递给 User 组件。

接下来,在 User 组件中,我们可以使用函数式组件来获取并渲染动态路由参数:

<template functional>
  <div>
    <h1>User {{ props.route.params.id }}</h1>
    <p>This is the user page.</p>
  </div>
</template>

在上面的例子中,我们使用了 props.route.params 来获取动态路由参数,并将其渲染到页面中。

三、Vue3 函数式组件的高级应用

image-20230421170528496.png

3.1 Scoped Slots

Vue3中函数式组件也支持Scoped Slots,它允许父组件将作用域插槽传递给函数式组件,从而可以将数据或方法传递给函数式组件。

首先,让我们定义一个接受Scoped Slots的函数式组件:

const FunctionalComponentWithScopedSlots = {
  functional: true,
  render(_, { slots }) {
    return slots.default({
      msg: 'Hello from scoped slot!'
    })
  }
}

在这个例子中,我们定义了一个函数式组件FunctionalComponentWithScopedSlots,它接受一个默认插槽,将一个对象{msg: 'Hello from scoped slot!'}传递给它,并通过slots.default将这个对象传递给子组件的插槽。

现在,让我们在父组件中使用这个函数式组件:

<template>
  <functional-component-with-scoped-slots v-slot="{ msg }">
    <div>{{ msg }}</div>
  </functional-component-with-scoped-slots>
</template><script>
import FunctionalComponentWithScopedSlots from './FunctionalComponentWithScopedSlots.vue'export default {
  components: {
    FunctionalComponentWithScopedSlots
  }
}
</script>

在这个例子中,我们使用了v-slot指令来绑定FunctionalComponentWithScopedSlots的Scoped Slots,将{msg: 'Hello from scoped slot!'}对象传递给插槽,并在插槽内部使用{{ msg }}来展示这个对象的msg属性。

3.2 组件缓存

Vue3 函数式组件的一个重要应用场景是组件缓存,即缓存组件的状态,以避免在组件被多次渲染时重复计算。

在 Vue2 中,我们可以使用 keep-alive 组件来实现组件缓存。但是在 Vue3 中,由于函数式组件的特殊性,我们需要使用另一种方式来实现组件缓存。

Vue3 提供了一个 cache 属性来实现组件缓存。我们可以在渲染函数中通过 cache 属性将组件状态缓存起来,并在下一次渲染时直接使用缓存的状态。

下面是一个使用函数式组件和组件缓存的示例代码:

<template>
  <div>
    <button @click="show = !show">Toggle Show</button>
    <hr>
    <component :is="myComponent" v-if="show"></component>
  </div>
</template><script>
import { ref, computed, h } from 'vue';// 定义一个组件缓存
const cache = new Map();export default {
  setup() {
    const show = ref(true);
    // 定义一个计算属性,根据 show 的值返回相应的组件
    const myComponent = computed(() => {
      return show.value ? cachedComponent() : null;
    });// 定义一个函数式组件
    const FunctionalComponent = (props, { slots }) => {
      return h('div', {}, slots.default());
    };// 将函数式组件进行缓存
    const cachedComponent = () => {
      if (!cache.has(FunctionalComponent)) {
        cache.set(FunctionalComponent, h(FunctionalComponent));
      }
      return cache.get(FunctionalComponent);
    };return {
      show,
      myComponent
    };
  }
};
</script>

在这个示例代码中,我们首先定义了一个 cache 对象来缓存组件状态。然后,我们定义了一个函数式组件 FunctionalComponent,并使用 cache 对象将它进行了缓存。

setup() 函数中,我们定义了一个响应式变量 show,用来控制组件是否显示。我们通过计算属性 myComponent 根据 show 的值返回相应的组件。

最后,在模板中使用 component 元素来动态渲染组件,并使用 v-if 指令来控制组件的显示。

这个示例代码中的函数式组件很简单,只是将插槽内容包装在一个 div 元素中,但是你可以在实际应用中使用更复杂的函数式组件来实现组件缓存。

3.3 嵌套组件

在 Vue3 中,函数式组件可以像普通组件一样嵌套使用。嵌套使用函数式组件可以更好地组织代码,使得组件结构更加清晰,易于维护。

嵌套函数式组件的语法与普通组件相同。例如,我们可以定义一个包含两个函数式组件的父组件:

<template functional>
  <div>
    <Child1 />
    <Child2 />
  </div>
</template><script>
import Child1 from './Child1.vue'
import Child2 from './Child2.vue'export default {
  components: {
    Child1,
    Child2
  }
}
</script>

在这个例子中,我们定义了一个包含两个函数式组件 Child1Child2 的父组件。在父组件中,我们直接使用了 Child1Child2,就像普通组件一样。

注意,这里的父组件也是一个函数式组件,并且需要将 Child1Child2 组件通过 components 选项进行注册。

3.4 Vue3 函数式组件的高级应用 动态组件

<template>
  <div>
    <button @click="toggleComponent">Toggle Component</button>
    <hr>
    <component :is="currentComponent"></component>
  </div>
</template><script>
import { ref, computed, h } from 'vue';// 定义一个组件缓存
const cache = new Map();export default {
  setup() {
    const currentComponentIndex = ref(0);// 定义一个计算属性,根据 currentComponentIndex 的值返回相应的组件
    const currentComponent = computed(() => {
      const components = [FunctionalComponent1, FunctionalComponent2];
      return components[currentComponentIndex.value]();
    });// 定义两个函数式组件
    const FunctionalComponent1 = () => {
      return h('div', {}, 'This is component 1');
    };const FunctionalComponent2 = () => {
      return h('div', {}, 'This is component 2');
    };// 将函数式组件进行缓存
    const cachedComponent = (component) => {
      if (!cache.has(component)) {
        cache.set(component, h(component));
      }
      return cache.get(component);
    };// 切换组件
    const toggleComponent = () => {
      currentComponentIndex.value = currentComponentIndex.value === 0 ? 1 : 0;
    };return {
      currentComponent,
      toggleComponent
    };
  }
};
</script>

在这个示例中,我们通过 currentComponentIndex 状态来切换两个函数式组件 FunctionalComponent1FunctionalComponent2,并将它们缓存起来,避免多次创建和销毁组件实例。然后在模板中使用动态组件来渲染当前的组件。

四、Vue3 函数式组件的注意事项和常见问题

image-20230421171146810.png

4.1 子组件如何更新父组件的状态

在普通的组件中,我们可以通过 $emit 方法向父组件派发事件来更新父组件的状态。但是在函数式组件中,由于没有实例对象,无法使用 $emit 方法,那么该如何更新父组件的状态呢?

这时可以利用函数式组件的 props 特性来解决。可以通过给函数式组件传递一个回调函数,在函数式组件内部调用该回调函数来更新父组件的状态。

例如,下面的代码演示了如何在函数式组件中通过传递回调函数来更新父组件的状态:

<!-- 父组件 -->
<template>
  <div>
    <h2>父组件</h2>
    <my-functional-component :count="count" @update-count="updateCount" />
    <p>count: {{ count }}</p>
  </div>
</template><script>
import { defineComponent, ref } from 'vue'
import MyFunctionalComponent from './MyFunctionalComponent.vue'export default defineComponent({
  components: {
    MyFunctionalComponent,
  },
  setup() {
    const count = ref(0)const updateCount = (value) => {
      count.value += value
    }return {
      count,
      updateCount,
    }
  },
})
</script>
<!-- 函数式组件 MyFunctionalComponent.vue -->
<template functional>
  <div>
    <h3>函数式组件</h3>
    <button @click="updateCount(1)">增加</button>
    <button @click="updateCount(-1)">减少</button>
  </div>
</template><script>
export default {
  props: {
    count: {
      type: Number,
      required: true,
    },
    updateCount: {
      type: Function,
      required: true,
    },
  },
}
</script>

在父组件中,通过 :count="count" 将父组件的 count 变量传递给函数式组件,同时通过 @update-count="updateCount" 将父组件的 updateCount 方法传递给函数式组件。

在函数式组件中,通过 props.count 获取父组件传递的 count 变量,通过 props.updateCount 获取父组件传递的 updateCount 方法,并在点击按钮时调用该方法来更新父组件的 count 变量。

4.2 函数式组件中如何使用this

在 Vue3 的函数式组件中,不能像普通组件那样使用 this 来访问组件实例。因为函数式组件本质上是一个纯函数,不会有组件实例的概念。

但是,Vue3 提供了 getCurrentInstance API,可以在函数式组件内获取到当前组件实例。通过 getCurrentInstance().proxy 可以获取到当前组件实例的代理对象,进而访问组件实例的属性和方法。

以下是一个示例:

<template functional>
  <div>
    <p>当前计数:{{ getCurrentInstance().proxy.count }}</p>
    <button @click="getCurrentInstance().proxy.increment">增加</button>
  </div>
</template><script>
import { getCurrentInstance } from 'vue'export default {
  data() {
    return {
      count: 0
    }
  },
  methods: {
    increment() {
      this.count++
    }
  }
}
</script>

4.3 函数式组件中的v-model

在 Vue3 的函数式组件中,可以使用 v-bindv-on 指令来实现 v-model 的功能。具体来说,使用 v-bind:modelValue 绑定组件的值,使用 v-on:update:modelValue 监听组件的值变化。注意,这里的 modelValue 是自定义的属性名,可以根据实际情况进行命名。

以下是一个示例:

<template functional>
  <div>
    <input :value="props.modelValue" @input="(event) => { props['onUpdate:modelValue'](event.target.value) }">
  </div>
</template><script>
export default {
  props: {
    modelValue: {
      type: String,
      default: ''
    },
    onUpdate: {
      type: Function,
      default: () => {}
    }
  }
}
</script>
```![在这里插入图片描述](https://img-blog.csdnimg.cn/fdfee1ac04af4051b2e557aabd305d53.gif#pic_center)

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

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

相关文章

DolphinDB 计算节点使用指南

导读 为了提升 DolphinDB 在高并发读写场景下的性能与稳定性&#xff0c;DolphinDB 在架构上引入了计算节点 &#xff08;compute node&#xff09; 。计算节点接管了数据节点的部分职能&#xff0c;负责响应客户端的请求并返回结果。在架构层面&#xff0c;将集群的计算与存储…

QT - 布局方式

Qt里面的头文件和类名是一致的&#xff0c;知道头文件就知道类名&#xff0c;反之亦然 Qt头文件是没有.h的&#xff0c;基本都是以大写的Q开头 后续的代码编写都在widget.h和widget.cpp 一. widget.h #ifndef WIDGET_H #define WIDGET_H #include <QWidget>/*QT系统自己使…

机器学习(六):基于高斯贝叶斯对面部皮肤进行预测分析

基于高斯贝叶斯对面部皮肤进行预测分析 作者&#xff1a;i阿极 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f44d;收藏&#x1f4…

ROS--机器人小车仿真rviz

URDF练习 需求描述: 创建一个四轮圆柱状机器人模型&#xff0c;机器人参数如下,底盘为圆柱状&#xff0c;半径 10cm&#xff0c;高 8cm&#xff0c;四轮由两个驱动轮和两个万向支撑轮组成&#xff0c;两个驱动轮半径为 3.25cm,轮胎宽度1.5cm&#xff0c;两个万向轮为球状&…

企业业财数字化建设-财务管理领域的产品设计

数字经济时代&#xff0c;企业数字化建设成为发展的必经之路&#xff0c;更多的企业搭建全渠道的营销&#xff0c;交易&#xff0c;履约和售后体系触达和服务用户&#xff0c;特别是面向小B和C端用户&#xff0c;交易变得更灵活多变。使得资源管控&#xff0c;稳定保守为底层基…

C语言的缺陷/错误处理问题探讨

最近遇到一个问题&#xff0c;先看看如下代码&#xff1a; uint8_t Bcd2Dec01(uint8_t bcd) {uint8_t one (bcd & 0x0F);uint8_t ten (bcd & 0xF0) >> 4;if ((one > 9) || (ten > 9)){printf("请输入合法的BCD码&#xff01;");return 0;}retu…

《C++内存管理》

本文主要介绍C内存管理的知识&#xff0c;主要包括new和delete&#xff0c;其实很简单&#xff0c;类比我们的C语言的内存管理malloc/free&#xff0c;就是在堆上申请内存的 小知识点&#xff1a; C构造对象的顺序&#xff1a;先构造全局&#xff0c;再构造局部静态对象&#x…

一些解决方案

文件异步下载方案 1 set QueryBussessType manually different type --> different resolving code、wherecondition 2. frontend request with the type 3. get excelHeader --> groovyUtil load from db 4. getData from db with pagination 5. saveData in an excel 6…

【测试面试】你要的宝典,软件接口测试面试题大全(总结)--附答案

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、接口测试主要目…

将war包发布到容器中的tomcat

文章目录 将war包直接发布到容器中使用数据卷将war包持久化到docker的宿主机(CentOS7) 将war包直接发布到容器中 1、将windows中的文件通过xftp程序传到centOS7中 2、创建容器&#xff0c;通过docker中的命令将web.jar复制到tomcat容器中 # 查看docker中的镜像 ~]$ docker imag…

0.8秒捕捉,速度超乎想象,小米和WPS用户太激动,office用户已用

只需0.8秒就能捕捉 距离4月18日小米13ultra发布会时间还剩一天。这几天雷军的微博已经把小米13ultra的亮点已经做了很多铺垫宣传。 除了系统和硬件之外&#xff0c;就是这次小米13ultra最大的“杀手锏”的就是“徕卡相机”。连宣传文案都改成了&#xff1a;一个伟大的瞬间&…

【UE】玩家位置存档

在上一篇博客中&#xff08;【UE】将存档的值显示在控件蓝图上&#xff09;我们介绍了如何将存档的值显示在控件蓝图上&#xff0c;本篇博客要介绍的是如何将玩家位置进行存档。 效果 可以看到重新进入游戏时&#xff0c;角色在存档点出现&#xff0c;而不是玩家出生点 步骤 …

XMU 算法分析与设计第三次上机题解

文章目录 一、BFS试炼之微博转发二、DFS试炼之不同路径数三、并查集试炼之合并集合并查集的介绍 四、堆排序堆排序的介绍 五、厦大GPA&#xff08;分组背包&#xff09;分组背包介绍 六、消防安全指挥问题&#xff08;最短路Floyd&#xff09;七、铺设光纤问题(最小生成树Prim)…

干货满满~如何解决跨域!!

1. 为什么会存在跨域 首先要知道&#xff0c;在浏览器/app中使用异步请求(ajax)发送到服务器时&#xff0c;会出现跨域问题。若是服务与服务之间通信是没有跨域这一说的 2. 浏览器为什么要设置跨域的存在&#xff1f; 为了防止恶意网页可以获取其他网站的本地数据&#xff0…

4.23、TCP状态转换(为什么四次挥手)

4.23、TCP状态转换 1.TCP状态转换图2.为什么需要四次挥手&#xff0c;状态转换 1.TCP状态转换图 2.为什么需要四次挥手&#xff0c;状态转换 2MSL&#xff08;Maximum Segment Lifetime&#xff09; 主动断开连接的一方, 最后进入一个 TIME_WAIT状态, 这个状态会持续: 2msl ms…

实例化构造方法static统统都学会

文章目录 前言一、实例化是什么&#xff1f;二、构造方法1.概念2.特性3.. 如果用户没有显式定义&#xff0c;编译器会生成一份默认的构造方法&#xff0c;生成的默认构造方法一定是无参的 四.static1.static修饰成员变量2.static修饰成员方法3.static成员变量初始化 总结 前言 …

AR实战-基于Krpano的多场景融合及热点自定义

背景 在之前的博客中&#xff0c;曾经介绍了关于Krpano的相关知识&#xff0c;原文&#xff1a;全景自动切片技术-krpano初识。简单讲解了基于krpano1.19-pr13下单张全景照片的处理与展示。随着实景中国在各地的落地生根&#xff0c;三维园区、三维景区、三维乡村等等需求的集中…

ERP系统给企业管理带来哪些改变?

企业资源计划&#xff08;ERP&#xff09;系统是一种综合性的管理工具&#xff0c;它可以集成和管理企业内部所有的业务流程和信息。自上世纪90年代以来&#xff0c;ERP系统已成为许多企业的重要工具&#xff0c;为企业管理带来了巨大的变革。 第一&#xff0c;ERP系统可以将企…

ArrayList与顺序表

目录 ​编辑 一、线性表 二、顺序表 1、接口的实现 &#xff08;1&#xff09;打印顺序表 &#xff08;2&#xff09;新增元素 &#xff08;3&#xff09;判定是否包含某个元素 &#xff08;4&#xff09;查找某个元素对应的位置下标 &#xff08;5&#xff09;获取 …

基于QTableView中的MVD代理添加总结

目录 1、Qt中MVD说明 1.1 View 1.2 Delegate 1.3 Model/View的基本原理 2、代码是现实示例 2.1 设置样式文件 2.2 set base attribute 2.3 设置model 2.4 设置表头 2.5 设置数据 2.6 添加代理控件 2.6.1 添加 QSpinBox 代理 2.6.2 添加 QComboBox 代理 2.6.…