当前位置: 首页 > news >正文

编写可复用性的模块

在生活中,重复的机械劳动会消耗我们的时间和精力,提高生产成本,降低工作效率。同样,在代码世界中,编写重复的代码会导致代码的冗余,页面性能的下降以及后期维护成本的增加。由此可见将重复的事情复用起来是提高生产效率、降低维护成本的不二之选。

在 Vue 项目中,每一个页面都可以看作是由大大小小的模块构成的,即便是一行代码、一个函数、一个组件都可以看作是一个个自由的模块。那么提高代码的复用性的关键便在于编写可复用的模块,也就是编写可复用的代码、函数和组件等。

一个简单的例子

let person = [];for (let i = 0; i < data.obj.items.length; i++) {person.push({name: data.obj.items[i].name,age: data.obj.items[i].age});
}

不知道上方代码给你的第一印象是什么?总之给我的印象是糟糕的,因为出现了重复性的代码片段 data.obj.items,可能这样的代码在我们团队开发中随处可见,这也说明了重复编码现象其实无处不在。

面对自己编写的代码,我们应该保持一颗去重的心,发现重复的地方就相当于找到了可以复用的模块。在不复用的情况下,上述代码一旦需要修改变量 itemslists,那么我们就得修改 3 处地方,不知不觉就增加了维护成本。而到时候往往修改你代码的人并不是你自己,所以对自己好点,对他人也会好点。复用后的代码如下:

let person = [];
let values = data.obj.items;for (let i = 0; i < values.length; i++) {person.push({name: values[i].name,age: values[i].age});
}

我们通过将 data.obj.items 的值赋值给变量 values 来实现了复用,此时修改 itemslists 的话我们只需修改一处地方即可,不管是维护成本还是代码可读性上,复用的优势都显而易见。

封装成一个函数

除了使用变量的赋值缓存使用来解决数据的重复读取外,我们在开发过程中重复性更多的也许是功能点的重复,比如:

<tempalte><div><input type="text" v-model="str1"><input type="text" v-model="str2"><div>{{ str1.slice(1).toUpperCase() }}</div><div>{{ str2.slice(1).toUpperCase() }}</div></div>
</template>

上述代码的重复功能点在于截取输入框中第二个字符开始到最后的值并把它们转化成大写字母,像这样很简单的操作虽然重复使用也不会出现太大的问题,但是如果是代码量较多的操作呢?重复书写相同功能的代码是一种不经过大脑思考的行为,我们需要对其进行优化,这里我们可以把功能点封装成一个函数:

export default {methods: {sliceUpperCase(val) {return val.slice(1).toUpperCase()}}
}

如此我们只要在用到该方法的地方调用即可,将值传入其中并返回新值。

当然像在双花括号插值和 v-bind 表达式中重复的功能点我们可以封装成过滤器:

仅做了解,在 Vue 3 中,过滤器被移除了,使用方法或计算属性可以代替它。

// 单文件组件注册过滤器
filters: {sliceUpperCase(val) {return val.slice(1).toUpperCase()}
}// 全局注册过滤器
Vue.filter('sliceUpperCase', function (val) {return val.slice(1).toUpperCase()
})

然后在 html 中使用“管道”符进行过滤:

<div>{{ str1 | sliceUpperCase }}</div>
<div>{{ str2 | sliceUpperCase }}</div>

封装成一个组件

相比较于函数的封装,规模更大一点的便是组件的封装,组件包含了模板、脚本以及样式的代码,在实际开发中组件的使用频率也是非常大的,我们项目中的每一个页面其实都可以看作是一个父组件,其可以包含很多子组件,子组件通过接收父组件的值来渲染页面,父组件通过响应子组件的回调来触发事件。

封装一个组件主要包含两种方式,一种是最常见的整体封装,用户通过改变数据源来呈现不同的页面状态,代码结构不可定制化。例如:

<div><my-component data="我是父组件传入子组件的数据"></my-component>
</div>

另一种便是自定义封装,也就是插槽(slot),我们可以开放一部分槽位给父组件,使其能够进行一定程度的定制化,例如:

<div><my-component data="我是父组件传入子组件的数据"><template slot="customize"><span>这是定制化的数据</span></template></my-component>
</div>

在 myComponent 组件中我们便可以接收对应的 slot:

<div class="container"><span>{{ data }}</span><slot name="customize"></slot>
<div>

这里我们通过定义 slot 标签的 name 值为 customize 来接收父组件在使用该组件时在 template 标签上定义的 slot="customize" 中的代码,不同父组件可以定制不同的 slot 代码来实现差异化的插槽。最终渲染出来的代码如下:

<div><div class="container"><span>我是父组件传入子组件的数据</span><span>这是定制化的数据</span></div>
</div>

这样我们就完成了一个小型组件的封装,将共用代码封装到组件中去,页面需要引入的时候直接使用 import 并进行相应注册即可,当然你也可以进行全局的引入:

import myComponent from '../myComponent.vue'// 全局
Vue.component('my-component', myComponent)

写了一个完整的例题,方便大家理解

我们将创建一个名为 BaseButton.vue 的按钮组件,该组件支持自定义文本、颜色和点击事件。

在 Vue 项目中,创建一个新的组件文件 BaseButton.vue

<template><button:class="buttonClass"@click="handleClick":style="{ backgroundColor: bgColor, color: textColor }"><slot>{{ text }}</slot></button>
</template><script>
export default {name: 'BaseButton',props: {text: {type: String,default: 'Button',},bgColor: {type: String,default: '#42b983',},textColor: {type: String,default: '#ffffff',},},computed: {buttonClass() {return {'base-button': true,'base-button--primary': this.bgColor === '#42b983','base-button--secondary': this.bgColor === '#35495e',};},},methods: {handleClick(event) {this.$emit('click', event);},},
};
</script><style scoped>
.base-button {padding: 10px 20px;border: none;border-radius: 5px;font-size: 16px;cursor: pointer;transition: background-color 0.3s;
}.base-button:hover {opacity: 0.9;
}
</style>

解释一下buttonClass 计算属性的作用

  1. 'base-button': true:

    • 这个条目保证了所有按钮都将始终拥有 base-button 类。
  2. 'base-button--primary': this.bgColor === '#42b983':

    • 当 bgColor 的值为 #42b983 时,计算属性返回 true,因此将 base-button--primary 类添加到按钮的类列表中,下面的同理。

Vue 会将 buttonClass 的返回值解析为按钮的 CSS 类。这样,根据 bgColor 的变化,按钮的外观可以动态调整,以便于根据不同的背景颜色应用不同的样式。这种方法使得组件更加灵活、可维护且计算属性会自动缓存,只有在依赖的 bgColor 属性发生变化时才会重新计算,从而提高性能。

在你的主组件或其他组件中使用 BaseButton 组件。假设我们在 App.vue 中使用它

<template><div id="app"><BaseButtontext="Primary Button"bgColor="#42b983"textColor="#ffffff"@click="onButtonClick"/><BaseButtontext="Secondary Button"bgColor="#35495e"textColor="#ffffff"@click="onButtonClick">Custom Slot Button</BaseButton></div>
</template><script>
import BaseButton from './components/BaseButton.vue';export default {name: 'App',components: {BaseButton,},methods: {onButtonClick(event) {console.log('Button clicked!', event);},},
};
</script><style>
#app {text-align: center;margin: 20px;
}
</style>
  • 属性BaseButton 组件接收三个 props:

    • text:按钮上的文本,默认为"Button"。
    • bgColor:按钮的背景颜色,默认为 #42b983
    • textColor:按钮的文本颜色,默认为 #ffffff

封装成一个插件

在某些情况下,我们封装的内容可能不需要使用者对其内部代码结构进行了解,其只需要熟悉我们提供出来的相应方法和 api 即可,这需要我们更系统性的将公用部分逻辑封装成插件,来为项目添加全局功能,比如常见的 loading 功能、弹框功能等。

Vue 提供给了我们一个 install 方法来编写插件,使用该方法中的第一个 Vue 构造器参数可以为项目添加全局方法、资源、选项等。比如我们可以给组件添加一个简单的全局调用方法来实现插件的编写:

/* toast.js */
import ToastComponent from './toast.vue' // 引入组件let $vmexport default {    install(Vue, options) {// 判断实例是否存在if (!$vm) {            const ToastPlugin = Vue.extend(ToastComponent); // 创建一个“扩展实例构造器”// 创建 $vm 实例$vm = new ToastPlugin({                el: document.createElement('div')  // 声明挂载元素          });            document.body.appendChild($vm.$el); // 把 toast 组件的 DOM 添加到 body 里} // 给 toast 设置自定义文案和时间let toast = (text, duration = options.duration || 3000) => {$vm.text = text;$vm.duration = duration;// 在指定 duration 之后让 toast 消失setTimeout(() => {$vm.isShow = false;  }, $vm.duration);}// 判断 Vue.$toast 是否存在if (!Vue.$toast) {            Vue.$toast = toast;        }        Vue.prototype.$toast = Vue.$toast; // 全局添加 $toast 事件}
}

成功编写完插件的 JS 脚本后,我们在入口文件中需要通过 Vue.use() 来注册一下该插件:

import Toast from '@/widgets/toast/toast.js'Vue.use(Toast); // 注册 Toast

最后我们在需要调用它的地方直接传入配置项使用即可,比如:

this.$toast('Hello World', 2000);

当然你也可以不使用 install 方法来编写插件,直接采用导出一个封装好的实例方法并将其挂载到 Vue 的原型链上来实现相同的功能。

拓展

1.在 Vue 中如何添加全局自定义指令?

1. 创建全局自定义指令

全局自定义指令可以通过 Vue 实例的 directive 方法来注册。下面是一个示例,展示如何创建一个简单的自定义指令,该指令用于改变元素的背景颜色。

示例:创建一个 v-color 指令

// main.js
import Vue from 'vue';
import App from './App.vue';// 注册全局自定义指令
Vue.directive('color', {// 当被绑定的元素插入到 DOM 中时调用inserted(el, binding) {el.style.backgroundColor = binding.value; // 设置背景颜色}
});new Vue({render: h => h(App),
}).$mount('#app');

在上面的代码中,我们创建了一个名为 v-color 的指令。当这个指令被绑定到一个元素时,它会将该元素的背景颜色设置为传入的值。

2. 在组件中使用自定义指令

一旦我们定义了全局指令,就可以在任何 Vue 组件中使用它。以下是如何在一个组件中使用 v-color 指令的示例:

<template><div><h1 v-color="'lightblue'">这是一个标题</h1><p v-color="'lightgreen'">这是一个段落</p></div>
</template><script>
export default {name: 'MyComponent'
}
</script><style>
/* 样式可以在这里定义 */
</style>

3. 自定义指令的钩子函数

全局自定义指令有以下几个钩子函数,可以用于不同的生命周期阶段:

  • bind(el, binding, vnode): 指令第一次绑定到元素时调用,只调用一次。
  • inserted(el, binding, vnode): 被绑定元素插入父节点时调用。
  • update(el, binding, vnode, oldVnode): 被绑定元素所在的 VNode 更新时调用。
  • componentUpdated(el, binding, vnode, oldVnode): 指令所在组件的 VNode 及其子 VNode 更新时调用。
  • unbind(el, binding, vnode): 只调用一次,指令与元素解绑时调用。

示例:使用更多的钩子函数

下面是一个更复杂的自定义指令示例,演示了如何使用多个钩子:

// main.js
Vue.directive('highlight', {// 绑定时bind(el) {el.style.transition = 'background-color 0.5s';},// 插入时inserted(el) {el.style.backgroundColor = 'yellow';},// 更新时update(el, binding) {el.style.backgroundColor = binding.value;},// 解绑时unbind(el) {el.style.backgroundColor = '';}
});

在这个例子中,v-highlight 指令会在绑定时设置过渡效果,并在元素插入时将背景色设置为黄色。它还会在更新时根据传入值改变背景色,并在解除绑定时清除样式。

4. 使用指令修饰符

指令也可以使用修饰符(如 .stop, .prevent, .self 等),以提供更灵活的功能。例如,如果你希望在点击元素时阻止事件冒泡,可以使用 v-on:click.stop

2.在 vue 路由切换时如何全局隐藏某个插件?

在路由切换时,你可以在 beforeEachbeforeResolve 钩子中调用隐藏 Toast 的方法。

下面是一个示例,展示如何在 Vue Router 中实现这一功能。

1. 创建 Toast 插件

这里是一个简单的示例:

// toast.js
let $vm;const ToastPlugin = {install(Vue) {if (!$vm) {const ToastComponent = Vue.extend({data() {return {isShow: false,text: '',duration: 3000};},template: `<div v-if="isShow" class="toast">{{ text }}</div>`,methods: {show(text, duration = this.duration) {this.text = text;this.isShow = true;setTimeout(() => {this.isShow = false;}, duration);},hide() {this.isShow = false;}}});$vm = new ToastComponent({ el: document.createElement('div') });document.body.appendChild($vm.$el);}Vue.prototype.$toast = {show(text, duration) {$vm.show(text, duration);},hide() {$vm.hide();}};}
};export default ToastPlugin;

2. 在 Vue Router 中使用导航守卫

接下来,设置 Vue Router 并在路由切换时调用 Toast 的 hide 方法:

// router.js
import Vue from 'vue';
import Router from 'vue-router';
import ToastPlugin from './toast';  // 导入 Toast 插件Vue.use(Router);
Vue.use(ToastPlugin);  // 使用 Toast 插件const routes = [// 定义你的路由
];const router = new Router({routes
});// 在路由切换前隐藏 Toast
router.beforeEach((to, from, next) => {// 调用 Toast 的 hide 方法以隐藏 ToastVue.prototype.$toast.hide();next(); // 继续路由导航
});export default router;

3. 在主入口文件中整合

将路由和 Toast 插件整合到主入口文件中:

// main.js
import Vue from 'vue';
import App from './App.vue';
import router from './router';  // 导入路由Vue.config.productionTip = false;new Vue({router,render: h => h(App),
}).$mount('#app');

4. 使用 Toast 插件

在你的组件中使用 Toast 插件:

<template><div><button @click="showToast">显示 Toast</button></div>
</template><script>
export default {methods: {showToast() {this.$toast.show('这是一个 Toast 提示!', 2000);}}
}
</script>

5. 完整效果

通过以上步骤,当你在应用中的任意位置使用 $toast.show 方法时,Toast 会显示。在每次路由切换时,beforeEach 钩子会调用 $toast.hide 方法,从而确保在新路由加载时 Toast 被隐藏。

3.如何实现一个表单验证插件?需要运用到哪些知识?

需要掌握以下知识点:

  • Vue 的插件机制:理解如何创建和使用 Vue 插件。
  • Vue 的混入(Mixin):使用混入将验证逻辑添加到组件中。
  • Vue 的数据响应性:使用 this.$set 来确保响应式地更新错误信息。
  • 事件处理:处理表单输入和提交事件。
  • 条件渲染:使用 v-if 条件渲染错误信息。

1. 创建基本的插件结构

目录结构示例:

/form-validator├── index.js        // 插件入口├── validator.js    // 验证逻辑└── styles.css      // 样式(可选)

2. 编写验证逻辑

创建一个 validator.js 文件,定义你的验证规则和逻辑。

// validator.js
const validators = {required(value) {return !!value || '该字段是必填的';},email(value) {const re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;return re.test(value) || '请输入有效的邮箱地址';},minLength(min) {return value => {return value.length >= min || `至少需要 ${min} 个字符`;};},maxLength(max) {return value => {return value.length <= max || `最多 ${max} 个字符`;};},// 可以添加更多验证规则
};export default validators;

3. 创建插件入口文件

index.js 中,定义插件的 API 和如何与 Vue 组件进行交互。

// index.js
import validators from './validator';const FormValidator = {install(Vue) {Vue.mixin({data() {return {formErrors: {}, // 存储表单错误信息};},methods: {validateField(fieldName, value, rules) {const errors = [];rules.forEach(rule => {const validate = typeof rule === 'function' ? rule : validators[rule];const result = validate(value);if (typeof result === 'string') {errors.push(result);}});this.$set(this.formErrors, fieldName, errors);},validateForm(fields) {this.formErrors = {};let isValid = true;for (const field in fields) {const { value, rules } = fields[field];this.validateField(field, value, rules);if (this.formErrors[field].length) {isValid = false;}}return isValid;},},});},
};export default FormValidator;

4. 使用插件

在你的 Vue 组件中使用这个插件。确保在你的主入口文件中安装该插件。

// main.js
import Vue from 'vue';
import App from './App.vue';
import FormValidator from './form-validator';Vue.use(FormValidator);new Vue({render: h => h(App),
}).$mount('#app');

5. 示例组件

创建一个示例组件,展示如何使用这个表单验证插件。

<template><form @submit.prevent="handleSubmit"><div><label for="email">邮箱:</label><input type="text" v-model="email" @blur="validateField('email', email, ['required', 'email'])" /><span v-if="formErrors.email.length">{{ formErrors.email[0] }}</span></div><div><label for="password">密码:</label><input type="password" v-model="password" @blur="validateField('password', password, [minLength(6)])" /><span v-if="formErrors.password.length">{{ formErrors.password[0] }}</span></div><button type="submit">提交</button></form>
</template><script>
export default {data() {return {email: '',password: '',};},methods: {handleSubmit() {const isValid = this.validateForm({email: { value: this.email, rules: ['required', 'email'] },password: { value: this.password, rules: [this.minLength(6)] },});if (isValid) {// 表单有效,执行提交逻辑alert('表单提交成功!');}},},
};
</script><style>
/* 添加一些样式 */
</style>

相关文章:

编写可复用性的模块

在生活中&#xff0c;重复的机械劳动会消耗我们的时间和精力&#xff0c;提高生产成本&#xff0c;降低工作效率。同样&#xff0c;在代码世界中&#xff0c;编写重复的代码会导致代码的冗余&#xff0c;页面性能的下降以及后期维护成本的增加。由此可见将重复的事情复用起来是…...

2025年1月4日CSDN的Markdown编辑器

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…...

广域网连接PPP

广域网连接PPP PPP协议是一种应用广泛的点到点链路协议&#xff0c;主要用于点到点连接的路由器间的通信。PPP协议既可以用于同步通信&#xff0c;也可以用于异步通信&#xff0c;本部分只讨论同步接口上的PPP配置。 锐捷路由器的同步串行口默认封装Cisco HDLC&#xff0c;所…...

【pyqt】(四)Designer布局

布局 之前我们利用鼠标拖动的控件的时候&#xff0c;发现一些部件很难完成对齐这些工作&#xff0c;pyqt为我们提供的多种布局功能不仅可以让排版更加美观&#xff0c;还能够让界面自适应窗口大小的变化&#xff0c;使得布局美观合理。最常使用的三种布局就是垂直河子布局、水…...

【从零开始入门unity游戏开发之——C#篇40】C#特性(Attributes)和自定义特性

文章目录 前言一、特性&#xff08;Attributes&#xff09;基本概念二、自定义特性1、自定义特性代码示例&#xff1a;2、应用自定义特性&#xff1a;3、解释3.1 **AttributeUsage 特性**3.2 特性的命名3.3 **构造函数**&#xff1a;3.4 **属性**&#xff1a; 4、使用反射获取特…...

DES密码的安全性分析(简化版本)

DES仍是世界上使用最广的&#xff08;DES发行后20年&#xff0c;互联网的兴起&#xff0c;人们开始觉得DES不安全了&#xff0c;但DES的实现成本也越来越低&#xff09; 宏观分析&#xff1a; 密钥空间方面&#xff1a; 密钥长度&#xff1a;DES 算法使用 56 位的密钥对数据…...

引入三方jar包命令

mvn install:install-file \ -Dfile本地磁盘路径 \ -DgroupId组织名称 \ -DartifactId项目名称 \ -Dversion版本号 \ -Dpackagingjar 例如 假设你的 JAR 文件路径是 /home/user/common-pojo-1.0-SNAPSHOT.jar&#xff0c;组织名称是 com.example&#xff0c;项目名…...

机器学习基础-机器学习的常用学习方法

半监督学习的概念 少量有标签样本和大量有标签样本进行学习&#xff1b;这种方法旨在利用未标注数据中的结构信息来提高模型性能&#xff0c;尤其是在标注数据获取成本高昂或困难的情况下。 规则学习的概念 基本概念 机器学习里的规则 若......则...... 解释&#xff1a;如果…...

在控制领域中如何区分有效性、优越性、稳定性和鲁棒性?

在控制领域中&#xff0c;区分有效性、优越性、稳定性和鲁棒性可以通过具体的控制器设计实例来更好地理解。以下以经典的质量-弹簧-阻尼系统的PID控制器设计为例&#xff0c;展示如何区分这四个性能指标。 经典质量-弹簧-阻尼系统的PID控制器设计 质量-弹簧-阻尼系统模型 考…...

美国宏观经济基础框架梳理

玩转币圈和美股&#xff0c;最关键的是理解美国宏观经济。以下是核心逻辑&#xff1a;美国经济数据→政策调整→资金流动→资产价格变化。掌握这些因素的关系&#xff0c;才能在市场中立于不败之地。 一、核心变量及其意义 1. GDP&#xff08;国内生产总值&#xff09; • …...

装饰器模式详解

装饰器模式&#xff08;Decorator Pattern&#xff09;是一种设计模式&#xff0c;属于结构型模式之一。它允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其结构。这种模式创建了一个装饰类&#xff0c;用来包装原有类的一个实例&#xff0c;从而扩展该实例的功能。…...

[最新] SIM卡取出后还能找到我的iPhone吗?

您是否曾在任何地方丢失过 SIM 卡&#xff1f;或者您是否已移除 SIM 卡&#xff0c;现在无法在任何地方找到您的 iPhone&#xff1f;在这篇博客中&#xff0c;您将了解即使 SIM 卡被移除&#xff0c;“查找我的 iPhone”也能正常工作。 在某些情况下&#xff0c;您必须取出 SIM…...

数据分析思维(六):分析方法——相关分析方法

数据分析并非只是简单的数据分析工具三板斧——Excel、SQL、Python&#xff0c;更重要的是数据分析思维。没有数据分析思维和业务知识&#xff0c;就算拿到一堆数据&#xff0c;也不知道如何下手。 推荐书本《数据分析思维——分析方法和业务知识》&#xff0c;本文内容就是提取…...

谷歌2025年AI战略与产品线布局

在2024年12月的战略会议上,谷歌高层向员工描绘了2025年的宏伟蓝图,特别是在人工智能(AI)领域。这一年被定位为AI发展的关键转折点,谷歌计划通过一系列新产品和创新来巩固其在全球科技领域的领导地位。本文将深入探讨谷歌的2025年AI战略、重点产品以及竞争策略。 一、整体…...

登录的几种方式

使用Session完成登录 1. 手机号发送验证码 逻辑步骤&#xff1a; 校验手机号格式是否正确。生成验证码&#xff08;例如使用Hutool工具类&#xff09;。将手机号和验证码存入Session。返回验证码发送成功的响应。 2. 用户登录逻辑 逻辑步骤&#xff1a; 从Session中获取存…...

Scala_【5】函数式编程

第五章 函数式编程函数和方法的区别函数声明函数参数可变参数参数默认值 函数至简原则匿名函数高阶函数函数作为值传递函数作为参数传递函数作为返回值 函数闭包&柯里化函数递归控制抽象惰性函数友情链接 函数式编程 面向对象编程 解决问题时&#xff0c;分解对象&#xff…...

解析 World Football Cup 问题及其 Python 实现

问题描述 本文讨论一道关于足球锦标赛排名规则的问题&#xff0c;来自 Berland 足球协会对世界足球规则的调整。题目要求对给定的比赛数据进行计算&#xff0c;并输出能进入淘汰赛阶段的球队列表。以下是规则详细描述。 题目规则 输入格式&#xff1a; 第一行包含一个整数 …...

9.系统学习-卷积神经网络

9.系统学习-卷积神经网络 简介输入层卷积层感受野池化层全连接层代码实现 简介 卷积神经网络是一种用来处理局部和整体相关性的计算网络结构&#xff0c;被应用在图像识别、自然语言处理甚至是语音识别领域&#xff0c;因为图像数据具有显著的局部与整体关系&#xff0c;其在图…...

基于FPGA的出租车里程时间计费器

基于FPGA的出租车里程时间计费器 功能描述一、系统框图二、verilog代码里程增加模块时间增加模块计算价格模块上板视频演示 总结 功能描述 &#xff08;1&#xff09;&#xff1b;里程计费功能&#xff1a;3公里以内起步价8元&#xff0c;超过3公里后每公里2元&#xff0c;其中…...

三甲医院等级评审八维数据分析应用(五)--数据集成与共享篇

一、引言 1.1 研究背景与意义 随着医疗卫生体制改革的不断深化以及信息技术的飞速发展,三甲医院评审作为衡量医院综合实力与服务水平的重要标准,对数据集成与共享提出了更为严苛的要求。在传统医疗模式下,医院内部各业务系统往往各自为政,形成诸多“信息孤岛”,使得数据…...

VUE条件树查询 自定义条件节点

之前实现过的简单的条件树功能如下图&#xff1a; 经过最新客户需求确认&#xff0c;上述条件树还需要再次改造&#xff0c;以满足正常需要&#xff01; 最新暴改后的功能如下红框所示&#xff1a; 页面功能 主页面逻辑代码&#xff1a; <template><div class"…...

什么是打流,怎么用iperf3打流

什么是打流 在网络安全和黑灰产领域&#xff0c;“打流”具有不同的含义&#xff0c;常用于形容通过技术手段制造流量假象或发起流量攻击。 流量攻击&#xff08;DDoS&#xff09;中的“打流”&#xff1a; “打流”指向目标服务器或网络发起 大规模的数据请求&#xff0c;造…...

使用MySQL APT源在Linux上安装MySQL

全新安装MySQL的步骤 以下说明假定您的系统上尚未安装任何版本的MySQL&#xff08;无论是由Oracle还是其他方分发&#xff09; 添加MySQL的Apt源。 将MySQL的APT存储库添加到系统的软件存储库列表中。 1、转到MySQL APT存储库的下载页面MySQL :: Download MySQL APT Reposi…...

redux react-redux @reduxjs/toolkit

redux团队先后推出了redux、react-redux、reduxjs/toolkit&#xff0c;这三个库的api各有不同。本篇文章就来梳理一下当我们需要在项目中集成redux&#xff0c;从直接使用redux&#xff0c;到使用react-redux&#xff0c;再到react-redux和reduxjs/toolkit配合使用&#xff0c;…...

【偏好对齐】通过ORM直接推导出PRM

论文地址&#xff1a;https://arxiv.org/pdf/2412.01981 相关博客 【自然语言处理】【大模型】 ΨPO&#xff1a;一个理解人类偏好学习的统一理论框架 【强化学习】PPO&#xff1a;近端策略优化算法 【偏好对齐】PRM应该奖励单个步骤的正确性吗&#xff1f; 【偏好对齐】通过OR…...

Python与其他编程语言的区别是什么?

Python是一种广泛使用的高级编程语言&#xff0c;以其简洁的语法、强大的库支持和广泛的应用领域而著称。与其他编程语言相比&#xff0c;Python具有许多独特的特点和优势。以下将从多个方面详细探讨Python与其他编程语言的区别&#xff0c;并通过示例进行说明。 一、语法简洁…...

cuda11.6和对应的cudnn(windows)

因为每次不同的torch版本要下对应的cuda&#xff0c;这次刚好在Windows上下好了一个cuda11.6和对应的cudnn&#xff0c;直接放到网盘中&#xff0c;大家有需要对应版本的可以直接下载&#xff1a; 链接&#xff1a;https://pan.quark.cn/s/f153a53830d4 大家自取&#xff0c;c…...

24年无人机行业资讯 | 12.23-12.29

24年无人机行业资讯 | 12.23-12.29 1、 国家发改委新设低空经济司&#xff0c;助力低空经济规范发展2、商务部支持无人机民用国际贸易&#xff0c;强调出口管制与安全并重3、滨州高新区首架无人机成功下线4、 2025第九届世界无人机大会筹备推进会顺利召开5、2024年世界无人机竞…...

uniapp:微信小程序文本长按无法出现复制菜单

一、问题描述 在集成腾讯TUI后&#xff0c;为了能让聊天文本可以复制&#xff0c;对消息组件的样式进行修改&#xff0c;主要是移除下面的user-select属性限制&#xff1a; user-select: none;-webkit-user-select: none;-khtml-user-select: none;-moz-user-select: none;-ms…...

qml Item详解

1、概述 Item是QML&#xff08;Qt Modeling Language&#xff09;的基础元素&#xff0c;所有其他可视化元素都继承自它。它代表了一个可视化的对象&#xff0c;虽然Item对象本身没有可视外观&#xff0c;但它定义了所有可视项之间通用的属性&#xff0c;比如位置、大小、旋转…...