Vue.js【组件基础(上)】

news2024/11/28 6:36:38

选项API和组合式API

选项式API

选项式API是一种通过包含多个选项对象来描述组件逻辑的API,其常用的选项包括datamethodscomputedwatch等。

组合式API

相比于选项API,组合式API是将组件中的数据、方法、计算属性、侦听器等代码全部组合在一起,写在setup()函数中。

选项API的语法格式如下。

<script>
export default {
  data() {
    return { // 定义数据 }
  },
  methods: { // 定义方法 },
  computed: { // 定义计算属性 },
  watch: { // 定义侦听器 }
}
</script>

组合API的语法格式如下。

<script>
import { computed, watch } from 'vue'
export default {
  setup() {
    const 数据名 = 数据值
    const 方法名 = () => {}
    const 计算属性名 = computed(() => {})
    watch(侦听器的来源, 回调函数, 可选参数)
    return { 数据名, 方法名, 计算属性名 }
  }
}
</script>

Vue还提供了setup语法糖,用于简化组合式API的代码。使用setup语法糖时,组合式API的语法格式如下。

<script setup>
import { computed, watch } from 'vue'
// 定义数据
const 数据名 = 数据值
// 定义方法
const 方法名 = () => {}
// 定义计算属性
const 计算属性名 = computed(() => {})
// 定义侦听器
watch(侦听器的来源, 回调函数, 可选参数)
</script>

选项式API和组合式API的关系

Vue提供的选项式API和组合式API这两种写法可以覆盖大部分的应用场景,它们是同一底层系统所提供的两套不同的接口选项式API是在组合式API的基础上实现的

生命周期函数

Vue中,组件的生命周期是指每个组件从被创建到被销毁的整个过程,每个组件都有生命周期。如果想要在某个特定的时机进行特定的处理,可以通过生命周期函数来完成。随着组件生命周期的变化生命周期函数会自动执行

组合式API下的生命周期函数如下表所示 

函数

说明

onBeforeMount()

组件挂载前

onMounted()

组件挂载成功

onBeforeUpdate()

组件更新前

onUpdated()

组件中的任意的DOM元素更新后

onBeforeUnmount()

组件实例被销毁前

onUnmounted()

组件实例被销毁后

onMounted()函数为例演示生命周期函数的使用 

<script setup>
import { onMounted } from 'vue'
onMounted(() => {
  // 执行操作
})
</script>

演示生命周期函数的使用方法

创建src\components\LifecycleHooks.vue文件,用于通过生命周期函数查看在特定时间点下的DOM元素

<template>  <div class="container">container</div> </template>
<script setup>
import { onBeforeMount, onMounted } from 'vue'
onBeforeMount(() => {
  console.log('DOM元素渲染前', document.querySelector('.container'))
})
onMounted(() => {
  console.log('DOM元素渲染后', document.querySelector('.container'))
})
</script>

修改src\main.js文件,切换页面中显示组件

import App from './components/LifecycleHooks.vue'

运行结果

选项API下的生命周期函数如下表所示 

函数

说明

beforeCreate()

实例对象创建

created()

实例对象创建

beforeMount()

页面挂载前

mounted()

页面挂载成功后

beforeUpdate()

组件更新前

updated()

组件中的任意的DOM元素更新

beforeDestroy()

组件实例销毁前

destroyed()

组件实例销毁后

演示选项式APIbeforeCreate()函数created()函数使用 

<script>
export default {
  data() { return { value: 'Hello Vue.js' } },
  beforeCreate() {
    console.log('实例对象创建前: ' + this.value)
  },
  created() {
    console.log('实例对象创建后: ' + this.value)
  }
}
</script>

组件的注册和引用

Vue项目中定义了一个新的组件后,要想在其他组件中引用这个新的组件,需要对新的组件进行注册。在注册组件的时候,需要给组件取一个名字,从而区分每个组件,可以帕斯卡命名法PascalCase)为组件命名

Vue提供了两种注册组件的方式,分别是全局注册局部注册

帕斯卡命名法(PascalCase):

帕斯卡命名法(Pascal Case)是一种在编程中使用的命名约定,它要求将变量名和函数名称等标识符的每个单词首字母大写,并且单词之间直接相连,没有空格。这种命名法通常用于类名、函数名、属性名等标识符的命名。

例如,类名可以使用帕斯卡命名法表示为`MyClass`、`PersonInfo`、`GameManager`;方法名可以是`CalculateTotalScore()`、`PrintUserInfo()`、`InitializeGameWorld()`;属性名可以是`PlayerName`、`HighScore`、`IsGameOver`。

1.全局注册

实际开发中,如果某个组件的使用频率很高,许多组件中都会引用该组件,则推荐将该组件全局注册被全局注册的组件可以在当前Vue项目的任何一个组件内引用。在Vue项目的src\main.js文件中,通过Vue应用实例的component()方法可以全局注册组件,该方法的语法格式如下。

component('组件名称', 需要被注册的组件)

上述语法格式中,component()方法接收两个参数,第1个参数为组件名称,注册完成后即可全局使用该组件名称,第2个参数为需要被注册的组件

src\main.js文件中注册一个全局组件MyComponent,示例代码如下。

import { createApp } from 'vue';
import './style.css'
import App from './App.vue'
import MyComponent from './components/MyComponent.vue'
const app = createApp(App)
app.component('MyComponent', MyComponent)
app.mount('#app')

component()方法支持链式调用,可以连续注册多个组件,示例代码如下。

app.component('ComponentA', ComponentA)
    .component('ComponentB', ComponentB)
    .component('ComponentC', ComponentC)

2.局部注册

实际开发中,如果某些组件只在特定的情况下被用到,推荐进行局部注册局部注册即在某个组件中注册被局部注册的组件只能在当前注册范围内使用

局部注册组件的示例代码如下

<script>
import ComponentA from './ComponentA.vue'
export default {
  components: { ComponentA: ComponentA }
}
</script>

使用setup语法糖时,导入的组件会被自动注册无须手动注册,导入后可以直接在模板中使用,示例代码如下。

<script setup>
import ComponentA from './ComponentA.vue'
</script>

引用组件

组件注册完成后,若要将组件在页面中渲染出来,需要引用组件

在组件的<template>标签中可以引用其他组件,被引用的组件需要写成标签的形式,标签名应与组件名对应。组件的标签名可以使用短横线分隔帕斯卡命名法命名。例如,<my-component>标签<MyComponent>标签都表示引用MyComponent组件。一个组件可以被引用多次,但不可出现自我引用和互相引用的情况,否则会出现死循环

解决组件之间的样式冲突

掌握组件之间样式冲突问题的解决方法,能够运用<style>标签的scoped属性深度选择器解决组件之间样式冲突的问题。

默认情况下,写在Vue组件中的样式会全局生效,很容易造成多个组件之间的样式冲突问题。例如,为ComponentUse组件中的h5元素添加边框样式具体代码如下

h5 {
  border: 1px dotted black;
}

从上图可以看出,ComponentUse组件GlobalComponent组件LocalComponent组件h5元素的边框样式都发生了改变,但是代码中只有ComponentUse组件设置了边框样式效果,说明组件之间存在样式冲突。

导致组件之间样式冲突的根本原因是:在单页Web应用中,所有组件的DOM结构都是基于唯一的index.html页面进行呈现的。每个组件中的样式都可以影响整个页面中的DOM元素

Vue中可以使用scoped属性深度选择器来解决组件之间的样式冲突

1.scoped属性

Vue<style>标签提供了scoped属性,用于解决组件之间的样式冲突

<style>标签添加scoped属性后,Vue会自动为当前组件的DOM元素添加一个唯一的自定义属性(如data-v-7ba5bd90),并在样式中为选择器添加自定义属性(如.list[data-v-7ba5bd90]),从而限制样式的作用范围,防止组件之间的样式冲突问题。

下面演示scoped属性使用。

修改ComponentUse组件,为<style>标签添加scoped属性,具体代码如下。

运行结果

打开开发者工具,切换到Elements面板,查看父组件的h5元素的代码,如下图所示。

图可以看出,当<style>标签添加scoped属性后,h5元素和相应的选择器被Vue自动添加了data-v-e4f30916属性,从而解决了样式冲突的问题。

2.深度选择器

如果给当前组件的<style>标签添加了scoped属性,则当前组件的样式对其子组件是不生效的

如果添加了scoped属性后还需要让某些样式对子组件生效,则可以使用深度选择器来实现

深度选择器通过:deep()伪类来实现,在其小括号中可以定义用于子组件的选择器,例如,“:deep(.title)”被编译之后生成选择器的格式为“[data-v-7ba5bd90] .title”

组件向子组件传递数据

声明props

若想实现父组件子组件传递数据,需要先在子组件中声明props表示子组件可以从父组件中接收哪些数据

不使用setup语法糖的情况下,可以使用props选项声明propsprops选项的形式可以是对象字符串数组。声明对象形式的props的语法格式如下。

<script>
export default {
  props: {
    自定义属性A: 类型,
    自定义属性B: 类型,
    ……
  }
}
</script>

如果不需要限制props的类型,可以声明字符串数组形式的props,示例代码如下。

props: ['自定义属性A', '自定义属性B'],

使用setup语法糖,可使用defineProps()函数声明props语法格式如下。

<script setup>
const props = defineProps({'自定义属性A': 类型}, {'自定义属性B': 类型})
</script>

使用defineProps()函数声明字符串数组形式的props,语法格式如下

const props = defineProps(['自定义属性A', '自定义属性B'])

在组件中声明了props后,可以直接在模板中输出每个prop,语法格式如下。

<template> 
  {{ 自定义属性A }}
  {{ 自定义属性B }}
</template>

静态绑定props

父组件引用子组件后,如果子组件中声明了props,则可以在父组件中向子组件传递数据。如果传递的数据是固定不变的,则可以通过静态绑定props的方式为子组件传递数据

静态绑定props的方式为子组件传递数据,其语法格式如下。

<子组件标签名 自定义属性A="数据" 自定义属性B="数据" />

上述语法格式中,父组件向子组件的props传递了静态的数据属性值默认为字符串类型

【注意】

果子组件中未声明props,则父组件向子组件中传递的数据会被忽略,无法被子组件使用。

动态绑定props

父组件中使用v-bind可以为子组件动态绑定props,任意类型的值都可以传给子组件的props,包括字符串数字布尔值数组对象等。

1.字符串

父组件中为子组件传递字符串类型props数据,示例代码如下。

<template>
  <Child :init="username" />
</template>
<script setup>
import Child from './Child.vue'
import { ref } from 'vue'
const username = ref('小圆')
</script>

上述代码用到了名称为Child子组件,该子组件的示例代码如下。

<template></template>
<script setup>
const props = defineProps(['init'])
console.log(props)
</script>

2.数字

父组件中为子组件传递数字类型props数据,示例代码如下。

<template>
  <Child :init="12" />
  <Child :init="age" />
</template>
<script setup>
import Child from './Child.vue'
import { ref } from 'vue'
const age = ref(12)
</script>

3.布尔值

父组件中为子组件传递布尔类型props数据,示例代码如下。

<template>
  <Child init />
  <Child :init="false" />
  <Child :init="isFlag" />
</template>
<script setup>
import Child from './Child.vue'
import { ref } from 'vue'
const isFlag = ref(true)
</script>

4.数组

父组件中为子组件传递数组类型props数据,示例代码如下。

<template>
  <Child :init="['唱歌', '跳舞', '滑冰']" />
  <Child :init="hobby" />
</template>
<script setup>
import Child from './Child.vue'
import { ref } from 'vue'
const hobby = ref(['唱歌', '跳舞', '滑冰'])
</script>

5.对象

父组件中为子组件传入一个对象类型props数据或者将对象中的部分属性作为被传入的props数据示例代码如下。

<template>
  <Child :init=“{ height: '180厘米’, weight: '70千克' }" />
  <Child :height="bodyInfo.height" :weight="bodyInfo.weight" />
  <Child v-bind="bodyInfo" />
</template>
<script setup>
import Child from './Child.vue'
import { reactive } from 'vue'
const bodyInfo = reactive({
  height: '180厘米',
  weight: '70千克'
})
</script>

props单向数据流

Vue中,所有的props都遵循单向数据流原则props数据父组件更新变化变化后的数据将向下流往子组件,而且不会逆向传递,这样可以防止因子组件意外变更props导致数据流向难以理解的问题

每次父组件绑定的props发生变更时,子组件中的props都将会刷新为最新的值。开发者不应该在子组件内部改变props,如果这样做,Vue会在浏览器的控制台中发出警告

验证props

封装组件时,可以在子组件中对从父组件传递过来的props数据进行合法性校验,从而防止出现数据不合法的问题

使用字符串数组形式的props缺点无法为每个prop指定具体的数据类型,而使用对象形式的props的优点是可以对每个prop进行数据类型的校验

对象形式props可以使用多种验证方案,包括基础类型检查必填项的校验属性默认值自定义验证函数。在声明props时,可以添加验证方案

1.基础类型检查

开发中,有时需要对从父组件中传递过来的props数据进行基础类型检查,这时可以通过type属性检查合法的类型,如果从父组件中传递过来的值不符合此类型,则会报错

常见的类型有String(字符串)、Number(数字)、Boolean(布尔值)、Array(数组)、Object(对象)、Date(日期)、Function(函数)、Symbol(符号)以及任何自定义构造函数

props指定基础类型检查,示例代码如下。

通过配置对象的形式定义验证规则,示例代码如下。

如果某个prop的类型不唯一,可以通过数组形式为其指定多个可能的类型,示例代码如下

必填项的校验

组件向子组件传递props数据时,有可能传递的数据为空,但是在子组件中要求该数据是必须传递的。此时,可以在声明props时通过required属性设置必填项强调组件的使用者必须传递属性的值,示例代码如下。

props: {
  自定义属性: { required: true },
}

默认属性值

声明props时,可以通过default属性定义属性默认值,当父组件没有向子组件的属性传递数据时,属性将会使用默认值,示例代码如下。

props: {
  自定义属性: { default: 0 },
}

自定义验证函数

如果需要对从父组件中传入的数据进行验证,可以通过validator()函数实现。validator()函数可以prop的值作为唯一参数传入自定义验证函数,如果验证失败,则会在控制台中发出警告。为prop属性指定自定义验证函数的示例代码如下。

props: {
  自定义属性: {
    validator(value) {
      return ['success', 'warning', 'danger'].indexOf(value) !== -1;
    },
  },
}

组件向父组件传递数据

子组件中声明自定义事件

若想使用自定义事件,首先需要在子组件中声明自定义事件

不使用setup语法糖时,可以通过emits选项声明自定义事件,示例代码如下。

<script>
export default {
  emits: ['demo']
}
</script>

在使用setup语法糖时,需要通过调用defineEmits()函数声明自定义事件,示例代码如下。

<script setup>
const emit = defineEmits(['demo'])
</script>

在上述代码中,defineEmits()函数的参数与emits选项中的相同

子组件触发自定义事件

在子组件中声明自定义事件后,接着需要在子组件中触发自定义事件

使用场景简单时,可以使用内联事件处理器,通过调用$emit()方法触发自定义事件,将数据传递给使用的组件,示例代码如下。

<button @click="$emit('demo', 1)">按钮</button>

在上述代码中,$emit()方法的第1个参数为字符串类型自定义事件的名称,第2个参数为需要传递的数据,当触发当前组件的事件时,该数据会传递给父组件。

除了使用内联方式外,还可以直接定义方法来触发自定义事件

不使用setup语法糖时,可以从setup()函数的第2参数(即setup上下文对象访问到emit()方法,示例代码如下。

export default {
  setup(props, ctx) {
    const update = () => {
      ctx.emit('demo', 2)
    }
    return { update }
  }
}

如果使用setup语法糖,可以调用emit()函数来实现,示例代码如下。

<script setup>
const update = () => {
  emit('demo', 2)
}
</script>

组件中监听自定义事件

在父组件中通过v-on可以监听子组件中抛出的事件,示例代码如下。

<子组件名 @demo="fun" />

上述代码中,当触发demo事件时,会接收到从子组件中传递的参数,同时会执行fun()方法。父组件可以通过value属性接收从子组件中传递来的参数

父组件中定义fun()方法,示例代码如下

const fun = value => {
  console.log(value)
}

演示子组件向父组件传递数据的方法

1.创建src\components\CustomSubComponent.vue文件,用于展示子组件的相关内容

<template>
  <p>count值为:{{ count }}</p>
  <button @click="add">加n</button>
</template>
<script setup>
import { ref } from 'vue'
const emit = defineEmits(['updateCount'])
const count = ref(1)
const add = () => {  count.value++ 
  emit('updateCount', 2) }
</script>

2.创建src\components\CustomEvents.vue文件,用于展示父组件的相关内容。

<template>
  <p>父组件当前的值为:{{ number }}</p>
  <CustomSubComponent @updateCount="updateEmitCount" />
</template>
<script setup>
import CustomSubComponent from './CustomSubComponent.vue'
import { ref } from 'vue'
const number = ref(10)
const updateEmitCount = (value) => {  number.value += value }
</script>

3.修改src\main.js文件,切换页面中显示组件

import App from './components/CustomEvents.vue'

运行示例

单击“加n”按钮后的页面效果如下图所示。

级组件之间的数据传递

Vue提供了跨级组件之间数据传递的方式——依赖注入。一个父组件相对于其所有的后代组件而言,可作为依赖提供者。而任何后代的组件树,无论层级多深,都可以注入由父组件提供的依赖。

对于父组件而言,如果要为后代组件提供数据,需要使用provide()函数。对于子组件而言,如果想要注入上层组件或整个应用提供的数据,需要使用inject()函数

1.provide()函数

provide()函数可以提供一个值用于被后代组件注入provide()函数的语法格式如下。

provide(注入名, 注入值)

provide()函数可以接收2参数,第1个参数是注入名,后代组件会通过注入名查找所需的注入值;第2个参数是注入值,值可以是任意类型,包括响应式数据,例如通过ref()函数创建的数据。

在不使用setup语法糖的情况下,provide()函数必须在组件的setup()函数中调用。使用provide()函数的示例代码如下。

<script>
import { ref, provide } from 'vue'
export default {
  setup() {
    const count = ref(1)
    provide( 'message', count )
  }
}
</script>

使用setup语法糖时,使用provide()函数的示例代码如下。

<script setup>
import { provide } from 'vue'
provide('message', 'Hello Vue.js')
</script>

provide()函数除了可以在某个组件中提供依赖外,还可以全局提供依赖。例如,在src\main.js文件中添加全局依赖,示例代码如下

const app = createApp(App)
app.provide('message', 'Hello Vue.js')

2.inject()函数

通过inject()函数可以注入上层组件或者整个应用提供的数据inject()函数的语法格式如下

inject(注入值, 默认值, 布尔值)

inject()函数有3个参数

  1. 1个参数是注入值Vue会遍历父组件,通过匹配注入的值来确定所提供的值,如果父组件链上多个组件为同一个数据提供了值,那么距离更近的组件将会覆盖更远的组件所提供的值
  2. 2个参数是可选的,用于在没有匹配到注入的值时使用默认值。第2个参数可以是工厂函数,用于返回某些创建起来比较复杂的值。如果提供的默认值是函数,还需要将false作为第3个参数传入,表明这个函数就是默认值,而不是工厂函数
  3. 3个参数是可选的,类型为布尔值,当参数值为false时,表示默认值是函数;当参数值为true时,表示默认值为工厂函数;当省略参数值时,表示默认值为其他类型的数据,不是函数或工厂函数。

在不使用setup语法糖的情况下inject()函数必须在组件的setup()函数中调用使用inject()函数的示例代码如下。

<script>
import { inject } from 'vue';
export default {
  setup() {
    const count = inject('count')
    const foo = inject('foo', 'default value')
    const baz = inject('foo', () => new Map())
    const fn = inject('function', () => { }, false)
  }
}
</script>

使用setup语法糖时使用inject()函数的示例代码如下。

<script setup>
import { inject } from 'vue';
const count = inject('count')
</script>

演示跨级组件之间的数据传递

1.创建src\components\ProvideChildren.vue文件,用于展示子组件中的相关内容。

<template>
  <div>子组件</div>
</template>

2.创建src\components\ProvideParent.vue文件,用于展示父组件中的相关内容

<template>
  <div>父组件</div>
  <hr>
  <ProvideChildren />
</template>
<script setup>
import ProvideChildren from './ProvideChildren.vue'
</script>

3.创建src\components\ProvideGrand.vue文件,用于展示父组件的父组件(即爷爷组件)中的相关内容

<template>  <div>爷爷组件</div>  <hr>  <ProvideParent />
</template>
<script setup>
import ProvideParent from './ProvideParent.vue'
import { ref, provide } from 'vue'
let money = ref(1000)
let updateMoney = (value) => {  money.value += value}
provide('money', money)
provide('updateMoney', updateMoney)
</script>

4.修改src\components\ProvideChildren.vue文件,通过inject()函数接收爷爷组件中传过来的数据

<template>
  <div>子组件</div>  <hr>  从爷爷组件接收到的资金:{{ money }}
  <button @click="updateMoney(500)">单击按钮增加资金</button>
</template>
<script setup>
import { inject } from 'vue'
let money = inject('money')
let updateMoney = inject('updateMoney')
</script>

5.修改src\main.js文件,切换页面中显示的组件

import App from './components/ProvideGrand.vue'

示例结果

单击“单击按钮增加资金”按钮后页面效果如下图所示。

本章小结

本章主要讲解了Vue组件基础知识,内容主要包括选项式API组合式API生命周期函数组件的注册和引用解决组件之间的样式冲突父组件向子组件传递数据子组件向父组件传递数据跨级组件之间的数据传递。通过本章的学习,能够对Vue的组件有整体的认识,能够利用组件进行项目开发。

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

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

相关文章

sigmoid函数实例

sigmoid实例案例&#xff1a;&#xff08;sigmoid作用就是把传统线性回归中的z 投射到分类问题&#xff08;0&#xff0c;1&#xff09;的概率中&#xff09; 交叉熵损失函数扩充解释&#xff1a; 为什么二分类和多分类的不一样 因为在二分类问题中 每个样本得值是0或1 一组数据…

使用spring模拟转账,并实现异常事务回滚

1、数据库准备 使用配置类配置数据源、模板、事务回滚 package cn.edu.aaa.utils;import java.beans.PropertyVetoException;import javax.sql.DataSource;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotati…

iterrows方法使dataframe显示完整

这样一个excel文件&#xff0c;由于行数太多显示不全。 直接读取显示&#xff1a; 该如何处理&#xff1f;方法有很多&#xff0c;这次讲解用dataframe.iterrows()方法。 DataFrame.iterrows()方法&#xff1a; 返回值是一个由索引和Series组成的元组。 关于这个方法的两个注…

程序汪10万接的多平台视频分发项目,模拟人工发视频

本项目来自程序汪背后的私活小团队&#xff0c;开发了一个多平台分发视频项目&#xff0c;给粉丝分享一下解决方案和具体项目分开情况付款情况等等细节&#xff0c;希望给想接私活的朋友一些经验参考 程序汪10万接的多平台视频分发项目&#xff0c;模拟人工发视频 视频版本 在 …

【网站项目】自助购药小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

VSCODE目录树缩进调整

VSCode默认的缩进太小了&#xff0c;简直看不出来&#xff0c;很容易弄混目录。在设置里修改就行了。 修改后效果&#xff1a;

代码随想录算法训练营第48天|198.打家劫舍|213.打家劫舍II| 337.打家劫舍III

代码随想录算法训练营第48天|198.打家劫舍|213.打家劫舍II| 337.打家劫舍III 今天就是打家劫舍的一天&#xff0c;这个系列不算难&#xff0c;大家可以一口气拿下。 198.打家劫舍 视频讲解&#xff1a;https://www.bilibili.com/video/BV1Te411N7SX https://programmercarl.c…

合并主分支到子分支

参考&#xff1a;【Git】合并分支出现 Please enter a commit message to explain why this merge is necessary.-CSDN博客 git 如何将主分支(master)合并到子分支上_git 将主分支合并到子分支-CSDN博客 1、先切换到主分支master git checkout master 2、把主分支代码拉到本地…

T-Mamba:用于牙齿 3D CBCT 分割的频率增强门控长程依赖性

T-Mamba&#xff1a;用于牙齿 3D CBCT 分割的频率增强门控长程依赖性 摘要Introduction方法T-Mamba architectureTim block T-Mamba: Frequency-Enhanced Gated Long-Range Dependendcy for Tooth 3D CBCT Segmentation 摘要 三维成像中的高效牙齿分割对于正畸诊断至关重要&am…

机器学习 —— 数据分析与图表绘制

本文使用工具 Anaconda下载安装与使用 Jupyter Notebook的使用 本文使用数据集 机器学习实验所需内容.zip 以朝阳医院2018年销售数据为例&#xff0c;目的是了解朝阳医院在2018年里的销售情况&#xff0c;这就需要知道几个业务指标&#xff0c;本次的分析…

Netty学习——源码篇13 命中缓存的分配

上一篇分析了DirectArena内存分配大小的大概流程(Netty池化内存管理机制),知道了其先命中缓冲&#xff0c;如果没有命中&#xff0c;再去分配一款连续内存。现在分析命中缓存的相关逻辑。前面说到PoolThreadCache中维护了三个缓存数组(实际上是6个&#xff0c;这里仅以Direct为…

matlab/simulink仿真全合集---电力电子的simulink仿真

simulink仿真新手大礼包&#xff0c;共整理了9份simulink仿真模型&#xff0c;每一份都是完美运行&#xff0c;适合电气工程专业/电力电子专业的新手学习。 1、Boost电路 simulink 仿真&#xff0c;boost 电路模块搭建和用传递函数进行验证&#xff0c; 电流开环控制 、电流闭…

基于Spring boot+Vue的业余排球俱乐部会员管理系统

5 系统功能模块的具体实现 5.1超级会员角色 5.1.1 登录 超级管理员登录通过用户名和密码去数据库查询用户表&#xff0c;该名称是否在用户表中存在&#xff0c;如果存在&#xff0c;则通过用户名和密码查询密码是否正确&#xff0c;然后吧用户的信息存在jwt的负载里&#xf…

C语言 | Leetcode C语言题解之第14题最长公共前缀

题目&#xff1a; 题解&#xff1a; char* longestCommonPrefix(char** strs, int strsSize) {if (strsSize 0) {return ""; } for (int i 0; i < strlen(strs[0]); i) {for (int j 1; j < strsSize; j) {if (strs[0][i] ! strs[j][i]){strs[0][i] \0;ret…

ics-05-攻防世界

题目 点了半天只有设备维护中心能进去 御剑扫一下 找到一个css 没什么用 再点击云平台设备维护中心url发生了变化 设备维护中心http://61.147.171.105:65103/index.php?pageindex试一下php伪协议 php://filter/readconvert.base64-encode/resourceindex.php base64解一下…

【二分查找】Leetcode 山脉数组的峰顶索引

题目解析 852. 山脉数组的峰顶索引 这到题使用暴力枚举的查找方法发现这段数组是有二段性的&#xff0c;峰顶左边的一段区间是一段递增区间&#xff0c;右边的一段区间是一段递减区间 算法讲解 class Solution { public:int peakIndexInMountainArray(vector<int>&am…

vue快速入门(十二)v-key索引标志

注释很详细&#xff0c;直接上代码 新增内容 v-key的使用场景数组筛选器的使用 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-…

漫谈:“标准”是一种幻觉 C++语言标准的意义

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 “标准”这个词很迷惑&#xf…

1688详情API接口:解锁多元化应用场景java php c++

随着互联网的快速发展&#xff0c;数据交换和信息共享已成为企业日常运营不可或缺的一部分。在这样的背景下&#xff0c;API&#xff08;应用程序接口&#xff09;接口作为实现数据互通的重要工具&#xff0c;受到了越来越多企业的青睐。1688详情API接口作为阿里巴巴旗下的重要…

黑盒测试—错误推测法

上一篇文章介绍了取款业务的场景测试法&#xff0c;在这里继续用上次的场景&#xff0c;对银行的ATM机进行存款&#xff0c;错误推测法算是对场景测试法的补充&#xff0c;错误推测法通常是根据经验来推测可能产生的结果&#xff0c;由原因推测结果。 上一篇文章地址&#xff…