Vue2高级篇

Vue高级

Vue生命周期

生命周期又称为生命周期回调函数、生命周期函数、生命周期钩子, 是Vue在运行过程中的关键时刻帮我们调用的一些指函数, 生命周期函数名字不可修改, 其中的this指向的是vm或组件实例对象.

常用的生命周期钩子:

  • mounted: 发送ajax请求、启动定时器、绑定自定义事件、订阅消息等初始化操作
  • beforeDestroy: 清除定时器、解绑自定义事件、取消订阅消息等收尾工作

在这里插入图片描述

关于销毁Vue实例

  • 销毁后借助Vue开发者工具开不到任何信息
  • 销毁后自定义事件会失效, 但原生DOM事件依然有效
  • 一般不会在beforeDestroy操作数据, 因为即便操作数据, 也不会再触发更新流程了

组件

组件的定义——实现应用中局部功能代码和资源集合, 使用组件化可以复用代码, 简化项目编码, 提高运行效率

  • 模块化: 当应用中的js都以模块来编写的, 那这个应用就是一个模块化的应用
  • 组件化: 当应用中的功能都是多组件的方式来编写的, 那这个应用就是一个组件化的应用

在这里插入图片描述

通过Vue.extend(options)可以创建一个组件, 其中options和new Vue(options)时传入的options几乎一样, 但也有点区别:

  • el不能写, 最后所有的组件都要经过一个vm的管理, 由vm中的el决定服务于那个容器
  • data必须写成函数, 因为组件通常都是复用的, 数据存在引用关系

注册组件的方式分为:

  1. 局部注册: 通过new Vue时传入components选项
  2. 全局注册: 通过Vue.component('组件名', 组件)
<div id="app">
  <!-- 3. 使用组件 -->
  <school></school>
</div>
<script>
  // 1. 声明一个组件 可以不写Vue.extend, 直接写对象
  const school = Vue.extend({
    template: `
      <div>
        <h1>{{ name }}</h1>
        <h1>{{ address }}</h1>
      </div>
    `,
    data() {
      return {
        name: 'putian',
        address: 'fujian'
      }
    }
  })

  new Vue({
    el: '#app',
    // 2. 注册组件
    components: {
      school
    }
  })
</script>

使用Vue组件时, 大驼峰式()的组件或单标签的写法都需要Vue脚手架支持.

Vue组件本质上是一个名为VueComponent的构造函数, 通过Vue.extend()生成的, 不同类型的组件对应的VueComponent构造函数不同(虽然名字都是同一个). 当我们使用组件时, 即在模板中声明<school></school>后, Vue解析时会帮我们创建school组件的实例对象. 也就是new VueComponent(options)

关于this指向问题

  • 组件配置中: data函数、methods中的函数、watch中的函数、computed中的函数都是VueComponent实例对象
  • new Vue(options)配置中: data函数、methods中的函数、watch中的函数、computed中的函数都是Vue实例对象

VueComponent.prototype._proto_ === Vue.prototype

有个如上的关系, 才能让组件实例对象可以访问到Vue原型上的属性、方法, 如图:

在这里插入图片描述

组件标识ref

ref被用来给元素或者子组件注册引用信息(id的替代者). 当ref应用在html标签上时, 获取的时真实DOM元素, 当应用在组件标签上时则是组件实例对象.

使用方式:

  • 声明标识
<h1 ref="xxx">...</h1>
<School ref=""></School>
  • 获取组件
this.$refs.xxx //xxx为ref的值

例如:

<School ref="school"></School>

export default {
  name: 'App',
  components: {
    School
  },
  methods: {
    showInfoApp() {
      console.log(this.$refs.school);
    }
  }
}
组件通信props

功能: 让组件接收外部传过来的数据(可以是函数)

语法: 使用组件时:

​ 组件定义时:

写法一: 简单接收声明接收——数组

new Vue({
  props: ['name', 'key2', 'key3']
})

写法二: 接收的同时对数据进行类型限制 简单对象

new Vue({
  props: {
    name: String,
    age: Number
  }
})

写法三: 接收的同时对数据进行类型限制 复杂对象, 默认值指定+必要性限制+类型限制

new Vue({
  props: {
    name: {
      type: String,
      // required: false,
      default: 'wang'
    }
  }
})

props是只读的, Vue会监测对props的修改, 如果进行了修改, 就会发出警告. 若业务需求确实需要修改, 那么需要复制props的内容到data中一份, 然后去修改data中的数据即可

混入mixin

功能: 可以把多个组件公用的配置提取成一个混入对象

  • 定义混合
// 定义一个混入js文件并导出对象
export const mixin = {
    methods: {
        showInfo() {
            alert(this.name)
        }
    }
}
  • 使用混入
// 1.导入混入
import {mixin} from "@/mixin";
// 2.使用混入(局部混入)
new Vue({
  mixins: ['mixin']
})
// 全局混入
Vue.mixin(xxx)

混入即将内容与组件内的内容合并, 当data产生冲突时, 会以组件内部声明的为主. vue的声明周期函数也可以使用混入, 这时会先调用混入的生命周期函数, 然后才调用组件内部的.

插件plugins

插件可以增强Vue, 其本质是包含install方法的一个对象, install的第一个参数是Vue, 第二个以后的参数是插件使用者传递的自定义参数.

  • 定义插件
对象.install = function(Vue, options) {
  // 1. 添加全局过滤器
  Vue.filter(...)
  // 2. 添加全局指令           
  Vue.directive(...)
  // 3. 配置全局混入(合)
  Vue.mixin(...)
  // 4. 添加实例方法
  Vue.prototype.$myMethod = function() {...}
  Vue.prototype.$myProperty = xxx
}
  • 使用插件
import plugins from ''
Vue.use('plugins', 'xx', 'xxx')
组件化编码流程
  1. 拆分静态组件: 组件要按照功能点拆分, 命名不能跟html元素冲突
  2. 实现动态组件: 需要考虑数据的存放位置, 数据是一个组件在用, 还是多个组件在用
    • 一个组件在用: 放在组件自身即可
    • 多个组件共用: 放在组件共同的父组件上(状态提升)
  3. 实现交互: 从绑定事件开始

案例: 组件化编码TODO

当数据在多个组件共用时, 会涉及组件的通信问题, props配置项适用于父子组件之间的通信, 这个通信是双向的, 既可以父传子, 也可以子向父组件传递信息(父组件传递函数给子组件)

使用v-model时, v-model绑定的值不能时props传递过来的值, 因为props是不可以修改的, 它是只读的

组件的自定义事件

组件的自定义事件是一种组件之间通信的方式, 适用于子组件向父组件传递信息.

使用场景: A是父组件, B时子组件, B想给A穿数据, 那么就要在A中给B绑定自定义事件(事件的回调函数在A中)

  1. 绑定自定义事件的两种方式(在使用到该组件的组件上绑定):
<!-- 方式一 -->
<Demo @testEvent='func'/>
<Demo v-on:testEvent='func'/>  
// 方式二
<Demo ref='demo'/>
  
mounted() {
  this.$refs.demo.$on('testEvent', this.func)
}

若只想让自定义事件只能触发一次, 可以使用once修饰符, 或者方式二中$on换成$once

  1. 触发自定义事件(在子组件中触发):
this.$emit('eventName', 参数)
  1. 解绑自定义事件:
this.$off('eventName') // 解绑一个事件
this.$off(['eventName1', 'eventName2']) // 解绑多个事件
this.$off() // 解绑所有事件

组件上也可以绑定原生DOM事件, 需要使用native修饰符

通过this.$ref.xxx.$on('eventName', func)绑定自定义事件时, 回调要配置在methods中, 要么使用箭头函数, 否则this指向会有问题

全局事件总线

全局事件总线是一种组件之间通信的方式, 适用于任意组件之间通信

  1. 安装全局事件总线
new Vue({
  // ...
  beforeCreate() {
    Vue.prototype.$bus = this // 安装全局实现总线, ¥bus就是当前正在创建的vm
  }
})
  1. 使用事件总线
  • 接收数据: A组件想要接收数据, 则在A组件中给$bus绑定自定义事件, 事件的回调留在A组件自身
methods: {
  // 声明回调
  demo(param) {
    // ..
  }
}
mounted() {
  this.$bus.$on('xxx', this.demo)
}
  • 提供数据
this.$bus.$emit('xxxx', 数据)

在beforeDestroy钩子中, 记得使用*$off*去解绑当前组件所用到的事件

消息订阅与发布

消息订阅发布也是一种组件间通信的方式, 适用于任意间组件的通信

  1. 安装pubsub库:
npm i pubsub-js
  1. 引入模块
import pubsub from 'pubsub-js'
  1. 订阅消息: A组件向接收数据, 则在A组件中订阅消息, 订阅的回调留在A组件自身
methods: {
  // 第一个参数是消息名称, 第二个开始才是真正的参数
  demo(msgName, data) {
    //...
  }
}
mounted() {
  this.pid = pubsub.subscribe('xxx', this.demo) // 订阅消息
}

发布订阅消息并不是Vue中的内容, 因此直接写普通函数时, this并不是vm实例对象, 此时可以写成箭头函数, 或者在methods中声明的函数

  1. 发布消息
pubsub.publish('xxx', 数据)
  1. 取消订阅
beforeDestroy: {
  pubSub.unsubscribe(pid)
}
$nextTick

语法: this.$nextTick(回调函数)

作用: 在下一次DOM更新结束后执行其指定的回调

当数据改变后, 要基于更新后的新DOM进行某些操作时, 要在nextTick所指定的回调函数中执行

插槽

作用: 让父组件可以向子组件指定位置插入html结构, 也是一种组件间通信的方式, 适用于父组件 => 子组件

  1. 默认插槽
<!-- parent -->
<Category>
  <div>html...</div>
</Category>
<!-- child -->
<template>
	<div>
    <!-- define slot -->
    <slot>default content</slot>
  </div>
</template>
  1. 具名插槽
<!-- parent -->
<Category>
	<template slot='center'>
  	<div>
      html tag
    </div>
  </template>
  <template v-slot:footer>
  	<div>
      html tags
    </div>
  </template>
</Category>
<!-- child -->
<template>
	<div>
    <slot name='center'>defaut content</slot>
    <slot name='footer'>defaut content</slot>
  </div>
</template>
  1. 作用域插槽
<!-- parent -->
<Category>
  <!-- receive data here -->
	<template scope='scopeData'>
    <!-- ul -->
  	<ul>
      <li v-for='g in scopeData.games' :key='g'>{{ g }}</li>
    </ul>
  </template>
</Category>

<Category>
	<template scope='scopeData'>
    <!-- ol -->
  	<ol>
      <li v-for='g in scopeData.games' :key='g'>{{ g }}</li>
    </ol>
  </template>
</Category>
<!-- child -->
<template>
	<div>
    <!-- scope slot -->
    <slot :games="games"></slot>
  </div>
</template>

<script>
	export deafault{
    name: 'Category',
    data() {
      // 数据在子组件中, 结构由使用者决定
      return {
        games: ['game1', 'game2']
      }
    }
  }
</script>

数据在组件自身, 但根据数据生成的结构需要组件的使用者来决定时才使用作用域插槽

Vuex

Vuex时专门在Vue中实现集中式状态(数据)管理的一个Vue插件, 对vue应用中多个组件的共享状态进行集中式的管理(读/写), 也是一种组件间通信的方式, 且适用于任意组件间的通信

在这里插入图片描述

  1. 多组件共享数据——全局事件总线

当涉及组件太多, 全局事件总线实现共享数据就很麻烦了.

在这里插入图片描述

  1. 多组件共享数据——vuex实现
  • 多个组件依赖于同一状态
  • 来自不同组件的行为需要变更同一状态

在这里插入图片描述

vuex基本使用
  1. 创建配置文件: src/store/index.js
import Vue from "视频笔记/前端/Vue/VueJunior"
import Vuex from "vuex"

// 应用vuex插件, 无法在App.vue中使用Vuex, 模块里的代码会先被执行, 然后才Vue.use
Vue.use(Vuex)

// 用于响应组件中的动作(业务逻辑)
const actions = {}
// 用于操作数据(方法名通常大写)
const mutations = {}
const state = {}

export default new Vuex.Store({
   actions, mutations, state
})

  1. 使用store
import store from "@/store";

export default {
  name: 'App',
  components: {
    HelloWorld,
    store
  }
}
  1. actions中的参数
// 第一个参数为上下文对象, 包含了dispach和commit等对象, 第二个为值
oddAdd(context, value) {
  if (context.state.sum % 2) context.commit('ADD', value)
}
  1. mutations中的参数
// 真正操作state的地方, 第一个参数为state对象
ADD(state, value) {
   state.sum += value
}

若没有网络请求或其他业务逻辑, 组件中也可以越过actions, 即不写dispatch 直接编写commit

getters配置项

当state中的数据需要加工后再使用时(逻辑复杂, 并且需要复用时), 可以使用getters加工.

  1. store.js中追加getters配置
const getters = {
  // 第一个参数就是数据源
  bigSum(state) {
    return // ...
  }
}
  1. 组件中读取数据
$store.getters.bigSum

可以将state和getters类比为vue中的data和computed之间的关系

Vuex的四个map方法的使用
  1. mapState方法: 用于映射state中的数据为计算属性
import { mapState } from Vuex

computed: {
  // 借助mapState生成计算属性: 对象写法
  ...mapState({ add:'add'})
  // 数组写法
  ...mapState(['add'])
}
  1. mapGetters方法: 映射getters中的数据为计算属性
computed: {
  ...mapGetters({bigSum:'bigSum'})
  // 数组写法
  ...mapGetters(['bigSum'])
}
  1. mapActions方法: 用于在组件中生成与actions 对话的方法, 即包含$store.dispatch(xxx)的函数
methods: {
  ...mapActions({ incrementOdd: 'incrementOdd', incrementWait:'incrementWait'})
  // 数组写法
  ...mapActions(['incrementOdd', 'incrementWait'])
}
  1. mapMutations方法: 用于生成在组件中与mutations对话的方法, 即包含$store.commit(xxx)的函数
methods: {
  ...mapMutations({increment: 'INCREMENT', decrement:'DECREMENT'})
  // 数组写法
  ...mapMutations('INCREMENT', 'DECREMENT')
}

mapActionsmapMutations使用时, 若需要传递参数, 在模板中绑定事件时需要传递好参数, 否则参数时事件对象

模块化与命名空间

可以将一类功能的配置项放到一个对象中, 并用命名空间将其标识

const countAbout = {
  namespaced: true,
  state: { x: 1},
  mutations: {...},
  actions: {...},
  getters: {...}
}
            
const personAbout = {
	namespaced: true,
  state: { x: 1},
  mutations: {...},
  actions: {...},
  getters: {...}       
}

new Vuex.Store({
	modules: {
  	countAbout,
    personAbout       
  }            
})            
  1. 开启命名空间后, 组件中读取state数据:
// 方式一:
this.$store.state.personAbout.x
// 方式二:
...mapState('namespace', ['x'])
  1. 读取getters数据
// 方式一:
this.$store.getters['personAbout/firstPersonName']
// 方式二:
...mapGetters('countAbout', ['bigSum'])
  1. 组件中调用dispatch
// 方式一
this.$store.dispatch('personAbout/xxx')
...mapActions('countAbout', ['xxx'])
  1. 组件中调用commit
// 方式一
this.$store.commit('personAbout/xxx', value)
...mapMutations('countAbout', ['xxx'])

路由

一个路由(route)就是一组映射关系, 多个路由需要路由器(router)进行管理

路由的基本使用
  1. 安装vue-router, 命令: npm i vue-router

  2. 应用插件: Vue.use(VueRouter)

  3. 配置路由

import VueRouter from 'vue-router'

export default new VueRouter({
  routes: [
    {
      name: 'xxx', // 路由命名(使用路由时方便编码)
      path: '/about',
      component: About,
      children: [
        {
          path: 'news', // 此处路由不需要再写’/‘
          component: News
        }
      ]
    },
    // ...
  ]
})
  1. 实现切换路由(active-class可配置高亮样式)
<router-link active-class='active' to='/about'>About</router-link>

路由跳转时, to属性还能写成对象形式, 如果路由有name属性, 可以不写路径, 通过name也能跳转

  1. 指定展示位置
<router-view></router-view>

几个注意点

  • 路由组件通常放在pages文件夹, 一般组件通常存放在components文件夹
  • 通过切换, “隐藏”了的路由组件, 默认是被销毁的, 需要的时候会重新挂载
  • 每个组件都有自己的$route属性, 里面存储着自己的路由信息
  • 整个应用只有一个router, 可以通过组件的$router属性获取到
路由传参
通过query传参
  1. 传递参数
<!-- 方式一:字符串写法 -->
<router-link :to='/home/message/detail?id=xxx&title=xxx'></router-link>

<!-- 方式二:对象写法 -->
<router-link :to='{
                  path: `/home/message/detail`,
                  query: {
                  	id: xxx,
                  	title: xxx
                  }
                  }'
  1. 接收参数
$route.query.xxx
通过params传参
  1. 配置路由, 声明接收params参数
new VueRouter({
  path: '/home',
  component: Home,
  children: [
    {
      path: 'news/:id/:title', //使用占位符声明接收params参数
      component: News
    }
  ]
})
  1. 传递参数
<router-link :to='/home/message/detail/xxx/xxx'></router-link>

路由携带params参数时, 如果使用to的对象写法, 则不能使用path配置项, 必须使用name配置!

路由的props配置

通过配置props配置项可以使组件更方便地接收路由参数

{
  name: 'route1',
  path: '/detail/:id',
  component: Detail,
  // 第一种写法: props值为对象, 该对象中所有的k-v最终都会通过props传给detail组件
  props: {a:900}
  // 第二种写法: boolean, 把路由中的所有params参数通过props传给Detail组件
  props: true
  // 第三种写法: props值为函数, 会把函数返回的对象的所有k-v通过props传给Detail组件
  props(route) {
    return {
      id: route.query.id,
      title: route.query.title
    }
  }
}
<router-link>的replace属性

浏览器的历史记录有两种写入方式分别是pushreplace, push是追加历史记录, replace则是替换当前记录. 路由跳转时候默认是push. 可以通过以下配置开启repalce模式

<router-link replace ...>News</router-link>
编程式路由导航

编程式路由可以不借助<router-link>实现路由跳转, 让路由跳转更加灵活

this.$router.push({
  name: 'path',
  params: {
    id: xxx,
    title: xxx
  }
})

this.$router.replace({
  name: 'path',
  params: {
    id: xxx
  }
})

this.$router.back()
this.$router.forward()
this.$router.go(3) // 正数前进, 负数后退
缓存路由组件

让不展示的路由组件保持挂载, 不被销毁. 缓存多个组件可以写数组

<!-- 要写组件名称 --> 
<keep-alice include="News">
	<router-view></router-view>
</keep-alice>
两个新的生命周期钩子

路由组件独有的两个钩子, 用于捕获路由组件的激活状态

  1. activated: 路由组件被激活时触发
  2. deactivated: 路由组件失活时触发
路由守卫

路由守卫可以对路由进行权限控制, 包括全局守卫、独享守卫、组件内守卫.

// 前置全局守卫 初始化时执行、每次路由切换前执行
router.beforeEach((to, from, next) => {
  if(to.meta.isAuth) {
    if(condition) {
      next() // 满足条件放行,
    }
  }
})

// 后置
router.afterEach((to, from) => {
  if(to.meta.title) {
    // ...
  }
})

// 独享守卫, 在具体的路由配置项中配置
beforeEnter(to, from, next) {
  
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Vue】VueX仓库

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;Vue ⛺️稳中求进&#xff0c;晒太阳 目录 Vue概述 是什么 vuex是一个vue的状态管理工具&#xff0c;状态就是数据 大白话&#xff1a;vuex是一个插件&#xff0c;可以帮我们管理vue通用…

BUUCTF---[极客大挑战 2019]BuyFlag1

1.题目描述 2.来到题目链接&#xff0c;先ctrlu打开源码查看&#xff0c;发现有两个可疑的文件 3.打开bay.php发现页面有两个提示 4.第一个提示告诉我们&#xff0c;如果想要买flag的话我们必须是来自cuit的学生并且要输入正确的密码 第二个提示告诉我们要用post方式传passwor…

Jenkins如何做到parameter页面里2个参数的联动

在Jenkins中&#xff0c;参数化构建是一种非常有用的功能&#xff0c;它可以让用户在构建过程中输入参数&#xff0c;从而实现更灵活的构建流程。有时候&#xff0c;我们希望两个参数之间能够实现联动&#xff0c;即一个参数的取值会影响另一个参数的取值。要实现这样的功能&am…

AI大模型:创新前沿的探索之路

AI大模型一直被视为人工智能领域的创新前沿&#xff0c;它们拥有强大的计算能力和学习能力&#xff0c;能够在各种复杂的任务中表现出色。随着技术的不断进步&#xff0c;越来越多的研究者和企业开始投入到AI大模型的研发和应用中&#xff0c;希望能够探索出更多的可能性。 在…

Linux——网络基础

计算机网络背景 网络发展 独立模式: 计算机之间相互独立 在早期的时候&#xff0c;计算机之间是相互独立的&#xff0c;此时如果多个计算机要协同完成某种业务&#xff0c;那么就只能等一台计算机处理完后再将数据传递给下一台计算机&#xff0c;然后下一台计算机再进行相应…

opencv官网 Blob检测

参考&#xff1a;Blob Detection Using OpenCV ( Python, C ) Bolob检测 Blob 是图像中一组连接的像素&#xff0c;它们共享一些共同属性&#xff08;例如&#xff0c;灰度值&#xff09;。在上图中&#xff0c;深色连接区域是 Blob&#xff0c;Blob 检测旨在识别和标记这些区…

七大 排序算法(一篇文章梳理)

一、引言 排序算法是计算机科学中不可或缺的一部分&#xff0c;它们在数据处理、数据库管理、搜索引擎、数据分析等多个领域都有广泛的应用。排序算法的主要任务是将一组数据元素按照某种特定的顺序&#xff08;如升序或降序&#xff09;进行排列。本文将对一些常见的排序算法…

内存安全的编程语言

美国政府新颁布《回归基础构件&#xff1a;通往安全软件之路》 《回归基础构件&#xff1a;通往安全软件之路》中&#xff0c;白宫国家网络主任办公室&#xff08;ONCD&#xff09;呼吁开发者使用「内存安全的编程语言」 内存安全的编程语言 根据NSA的建议&#xff0c;内存…

Jenkins设置使用163邮箱发送邮件

目录 一、下载需要的插件 二、开通163邮箱的SMTP服务 三、配置邮箱&#xff0c;测试发送 1、配置Jenkins Location 2、配置Extended E-mail Notification 扩展邮件通知 3、配置默认触发器&#xff08;可先不配置&#xff09; ​编辑 4、配置默认的邮件通知 5、测试邮箱…

Jenkins发送邮件、定时执行、持续部署

集成Allure报告只需要配置构建后操作即可。但如果是web自动化&#xff0c;或是用HTMLTestRunner生成报告&#xff0c;构建后操作要选择Publish HTML reports&#xff0c;而构建中还要添加Execute system Groovy script插件&#xff0c;内容&#xff1a; System.setProperty(&q…

VMvare17安装centos8安装宝塔面板 教程

阿里镜像站&#xff1a;https://mirrors.aliyun.com/centos centos-8-isos-x86_64安装包下载_开源镜像站-阿里云 https://mirrors.aliyun.com/centos/8/isos/x86_64/CentOS-8.5.2111-x86_64-dvd1.iso 将上面的链接复制到迅雷进行高速下载 vmvare安装配置教程安装教程 CentOS…

MySQL学习笔记(一)数据库事务隔离级别与多版本并发控制(MVCC)

一、数据库事务隔离级别 数据库事务的隔离级别有4种&#xff0c;由低到高分别为Read uncommitted &#xff08;读未提交&#xff09;、Read committed&#xff08;读提交&#xff09; 、Repeatable read&#xff08;可重复读&#xff09; 、Serializable &#xff08;串行化&a…

爬虫学习笔记-requests爬取NBA得分榜

1.导入requests库,用于请求获取URL位置的资源 import requests 2.导入lxml库,解析及生成xml和html文件 from lxml import etree 3.定义发送请求的地址 url https://nba.hupu.com/stats/players 4.定义请求头 headers {User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64…

机器学习-面经(part6、集成学习)

10 集成学习 定义:通过结合多个学习器(例如同种算法但是参数不同,或者不同算法),一般会获得比任意单个学习器都要好的性能,尤其是在这些学习器都是"弱学习器"的时候提升效果会很明显。 10.1 Boosting(提升法) 可以用于回归和分类 问题,它每一…

Zabbix监控容器MongoDB,报错:Unknown metric mongodb.server.status

在Zabbix中配置监控MongoDB容器时&#xff0c;如果遇到Unknown metric mongodb.server.status这样的错误&#xff0c;通常意味着Zabbix Agent尝试从MongoDB获取某个预定义的性能指标&#xff08;例如mongodb.server.status&#xff09;&#xff0c;但是未能成功识别或解析该指标…

政安晨【TypeScript高级用法】(四):模块与声明文件

TypeScript是一种静态类型的JavaScript超集语言&#xff0c;它支持模块化开发和声明文件。 模块化开发是一种将代码分割为独立的模块&#xff0c;每个模块只关注自己的功能&#xff0c;然后通过导入和导出来实现模块之间的交互和复用。在TypeScript中&#xff0c;可以使用impo…

Day18:信息打点-小程序应用解包反编译动态调试抓包静态分析源码架构

目录 小程序获取-各大平台&关键字搜索 小程序体验-凡科建站&模版测试上线 小程序抓包-Proxifier&BurpSuite联动 小程序逆向-解包反编译&动态调试&架构 思维导图 章节知识点 Web&#xff1a;语言/CMS/中间件/数据库/系统/WAF等 系统&#xff1a;操作系…

第十五届蓝桥杯青少组STEMA测评SPIKE初级真题试卷 2024年1月

第十五届蓝桥杯青少组STEMA测评SPIKE初级真题试卷 2024年1月 ​​​​​​​ 来自&#xff1a;6547网 http://www.6547.cn/doc/vywur8eics

hive实战项目:旅游集市数仓建设

旅游集市数仓建设 文章目录 旅游集市数仓建设为什么要设计数据分层&#xff1f;分层设计ODS&#xff08;Operational Data Store&#xff09;&#xff1a;数据运营层DW&#xff08;Data Warehouse&#xff09;&#xff1a;数据仓库层DWD&#xff08;Data Warehouse Detail&…

Neo4j 新手教程 环境安装 基础增删改查 python链接 常用操作 纯新手向

Neo4j安装教程&#x1f680; 目前在学习知识图谱的相关内容&#xff0c;在图数据库中最有名的就是Neo4j,为了降低入门难度&#xff0c;不被网上很多华丽呼哨的Cypher命令吓退&#xff0c;故分享出该文档&#xff0c;为自己手动总结&#xff0c;包括安装环境&#xff0c;增删改查…