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

Vue基础(2)

19、组件之间传递数据

组件与组件之间不是完全独立的,而是有交集的,那就是组件与组 件之间是可以传递数据的 传递数据的解决方案就是 props

ComponentA.vue

<template><!-- 使用ComponentB组件,并传递title属性 --><h3>ComponentA</h3><ComponentB title="传递数据"/>
</template><script>
// 导入ComponentB组件
import ComponentB from "./ComponentB.vue";export default {// 定义组件选项对象components: {// 将ComponentB注册为当前组件的局部组件ComponentB}
};
</script>

ComponentB.vue 

<template><!-- 使用props接收来自父组件的title属性 --><h3>ComponentB</h3><p>{{ title }}</p>
</template><script>
export default {// 定义组件选项对象props: ["title"]
};
</script>

动态数据传递

<template><!-- 使用ComponentA和ComponentB组件 --><h3>ComponentA</h3><!-- 将父组件的数据message传递给ComponentB --><ComponentB :title="message" />
</template><script>
// 导入ComponentB组件
import ComponentB from "./ComponentB.vue";export default {// 定义组件选项对象data() {return {message: "动态数据" // 定义数据message};},components: {ComponentB // 将ComponentB注册为当前组件的局部组件}
};
</script>

注意事项:

props 传递数据,只能从父级传递到子级,不能反其道而行

组件传递多种数据类型

通过 props 传递数据,不仅可以传递字符串类型的数据,还可以是其 他类型,例如:数字、对象、数组等 但实际上任何类型的值都可以作为 props 的值被传递.

传递Number类型

ComponentA.vue

<template><!-- 显示ComponentA标题 --><h3>ComponentA</h3><!-- 使用ComponentB组件,并传递age属性 --><ComponentB :age="age"/>
</template><script>
// 导入ComponentB组件
import ComponentB from "./ComponentB.vue";export default {data() {return {age: 20 // 定义数据age};},components: {ComponentB // 将ComponentB注册为当前组件的局部组件}
};
</script>

 ComponentB.vue

<template><!-- 显示ComponentB标题 --><h3>ComponentB</h3><!-- 显示从父组件传递过来的age属性 --><p>{{ age }}</p>
</template><script>
export default {props: ["age"] // 定义props接收来自父组件的age属性
};
</script>

传递Array类型

ComponentA.vue

<template><!-- 显示ComponentA标题 --><h3>ComponentA</h3><!-- 使用ComponentB组件,并传递names属性 --><ComponentB :names="names" />
</template><script>
// 导入ComponentB组件
import ComponentB from "./ComponentB.vue";export default {data() {return {names: ["iwen", "ime", "frank"] // 定义数据names};},components: {ComponentB // 将ComponentB注册为当前组件的局部组件}
};
</script>

 ComponentB.vue

<template><!-- 显示ComponentB标题 --><h3>ComponentB</h3><!-- 使用v-for指令遍历names数组,并显示每个元素 --><p v-for="(item, index) of names" :key="index">{{ item }}</p>
</template><script>
export default {props: ["names"] // 定义props接收来自父组件的names属性
};
</script>

传递Object类型

ComponentA.vue

<template><!-- 显示ComponentA标题 --><h3>ComponentA</h3><!-- 使用ComponentB组件,并传递userInfo属性 --><ComponentB :userInfo="userInfo" />
</template><script>
// 导入ComponentB组件
import ComponentB from "./ComponentB.vue";export default {data() {return {userInfo: { // 定义数据userInfoname: "iwen",age: 20}};},components: {ComponentB // 将ComponentB注册为当前组件的局部组件}
};
</script>

 ComponentB.vue

<template><!-- 显示ComponentB标题 --><h3>ComponentB</h3><!-- 显示从父组件传递过来的userInfo.name属性的值 --><p>{{ userInfo.name }}</p><!-- 显示从父组件传递过来的userInfo.age属性的值 --><p>{{ userInfo.age }}</p>
</template><script>
export default {props: ["userInfo"] // 定义props接收来自父组件的userInfo属性
};
</script>

组件传递Props效验

Vue 组件可以更细致地声明对传入的 props 的校验要求

ComponentA.vue

<template><!-- 显示ComponentA标题 --><h3>ComponentA</h3><!-- 使用ComponentB组件,并传递title和userInfo属性 --><ComponentB title="Props效验" :userInfo="userInfo" />
</template><script>
// 导入ComponentB组件
import ComponentB from "./ComponentB.vue";export default {data() {return {userInfo: { // 定义数据userInfoname: "iwen",age: 20}},components: {ComponentB // 将ComponentB注册为当前组件的局部组件}
};
</script>

ComponentB.vue

<template><!-- 显示ComponentB标题 --><h3>ComponentB</h3><!-- 显示从父组件传递过来的title属性的值 --><p>{{ title }}</p><!-- 显示从父组件传递过来的userInfo.name属性的值 --><p>{{ userInfo.name }}</p><!-- 显示从父组件传递过来的userInfo.age属性的值 --><p>{{ userInfo.age }}</p>
</template><script>
export default {props: { // 定义props接收来自父组件的title和userInfo属性title: {type: String},userInfo: {type: Object}}
};
</script>

默认值default

<template><!-- 显示ComponentB标题 --><h3>ComponentB</h3><!-- 显示从父组件传递过来的title属性的值 --><p>{{ title }}</p><!-- 显示从父组件传递过来的userInfo.name属性的值 --><p>{{ userInfo.name }}</p><!-- 显示从父组件传递过来的userInfo.age属性的值 --><p>{{ userInfo.age }}</p><!-- 显示从父组件传递过来的age属性的值 --><p>{{ age }}</p>
</template><script>
export default {// 定义props选项,接收来自父组件的title、userInfo和age属性props: {title: {type: String // title属性的类型为String},userInfo: {type: Object, // userInfo属性的类型为Objectdefault() {return {} // 默认值为空对象}},age: {type: Number, // age属性的类型为Numberdefault: 20 // 默认值为20}}
};
</script>

必选项required

<template><!-- 显示ComponentB标题 --><h3>ComponentB</h3><!-- 显示从父组件传递过来的title属性的值 --><p>{{ title }}</p><!-- 显示从父组件传递过来的userInfo.name属性的值 --><p>{{ userInfo.name }}</p><!-- 显示从父组件传递过来的userInfo.age属性的值 --><p>{{ userInfo.age }}</p><!-- 显示从父组件传递过来的age属性的值 --><p>{{ age }}</p>
</template><script>
export default {// 定义props选项,接收来自父组件的title、userInfo和age属性props: {title: {type: String, // title属性的类型为Stringrequired: true // title属性是必需的},userInfo: {type: Object, // userInfo属性的类型为Object// 对象或者数组应当用工厂函数返回default() {return {} // 默认值为空对象}},age: {type: Number, // age属性的类型为Numberdefault: 20 // 默认值为20}
};
</script>

在Vue.js中,prop 是一种特殊的数据属性,用于父组件向子组件传递数据。prop 是只读的,这意味着子组件不能修改从父组件接收到的 prop 数据。如果尝试修改 prop 的值,Vue 会发出警告信息,提示 prop 是只读的。

20、组件事件

在Vue.js框架中,组件之间的通信是一个常见的需求。$emit方法就是用来在组件的模板表达式中触发自定义事件的,这使得父子组件之间可以进行通信。通过这种方式,子组件可以向父组件发送消息,比如通知某个操作已经完成,或者请求父组件执行某个操作。

自定义事件的触发可以用于多种目的,其中之一就是组件之间传递数据。例如,当用户在子组件中进行某种操作时,子组件可以通过$emit方法向父组件发送一个事件,携带必要的数据。父组件可以监听这个事件,并在事件触发时接收数据,从而实现数据的传递。

父组件(ComponentA.vue)

<template><!-- 显示标题 --><h3>ComponentA</h3><!-- 引入子组件ComponentB,并监听名为some-event的自定义事件 --><ComponentB @some-event="getHandle"/><!-- 显示从子组件接收到的数据 --><p>ComponentA接受的数据: {{ message }}</p>
</template><script>
// 导入子组件ComponentB
import ComponentB from "./ComponentB.vue"export default {data() {return {// 初始化一个空字符串用于存储从子组件接收到的数据message: ""}},components: {// 注册子组件ComponentBComponentB},methods: {// 定义一个方法getHandle,用于处理从子组件接收到的数据getHandle(data) {this.message = data; // 将接收到的数据赋值给message属性}}
}
</script>

子组件(ComponentB.vue)

<template><!-- 显示标题 --><h3>ComponentB</h3><!-- 定义一个按钮,点击时触发sendHandle方法 --><button @click="sendHandle">发送数据</button>
</template><script>
export default {methods: {// 定义一个方法sendHandle,用于触发自定义事件并发送数据sendHandle() {this.$emit("someEvent", "ComponentB的数据"); // 触发名为someEvent的事件,并传递数据}}
}
</script>

组件之间传递数据:

  1. 父传子:使用 props

    • 在Vue.js中,props是父组件向子组件传递数据的一种方式。父组件可以通过在子组件标签中定义属性来传递数据,这些属性在子组件内部可以通过props对象访问。

    • 这种方式是单向数据流,确保了数据的流向是从父组件到子组件,有助于避免组件之间的耦合。

  2. 子传父:使用自定义事件 (this.$emit)

    • 当需要从子组件向父组件传递数据时,可以使用自定义事件。子组件通过this.$emit方法触发一个事件,并将数据作为参数传递。父组件需要监听这个事件,并在事件触发时接收数据。

    • 这种方式允许子组件在需要时通知父组件,例如用户交互或数据变化。

组件事件配合 v-model 使用

如果是用户输入,我们希望在获取数据的同时发送数据配合 v-model 来使用

父组件(ComponentA.vue)

<template><div><h3>ComponentA</h3><!-- 使用@some-event监听来自ComponentB的自定义事件 --><componentB @some-event="getHandle"/><!-- 显示从ComponentB接收到的数据 --><p>ComponentA接受的数据: {{ message }}</p></div>
</template><script>
// 导入子组件ComponentB
import ComponentB from "./ComponentB.vue"export default {data() {return {// 初始化message为空字符串,用于存储从子组件接收的数据message: ""}},components: {// 注册子组件ComponentBComponentB},methods: {// 定义getHandle方法来接收从子组件传递的数据getHandle(data) {this.message = data;}}
}
</script>

子组件(ComponentB.vue)

<template><div><h3>ComponentB</h3><!-- 使用v-model绑定输入框的值到searchText --><input v-model="searchText" /></div>
</template><script>
export default {data() {return {// 初始化searchText为空字符串searchText: ""}},watch: {// 监听searchText的变化searchText(newVal, oldVal) {// 当searchText变化时,触发someEvent事件,并将新值作为参数传递this.$emit("someEvent", newVal);}}
}
</script>

组件数据传递

通常我们使用 props 来实现父组件向子组件的数据传递(单向下行绑定),但Vue.js也提供了一种方式,使得子组件可以通过 props 实现数据的“回传”给父组件,这通常通过使用 .sync 修饰符或在Vue 3中使用 v-model 来实现。

父组件(ParentComponent.vue)

<template><div><h3>ComponentA</h3><!-- 使用:onFnEvent监听来自ChildComponent的自定义事件 --><Child :onFnEvent="fn" /><!-- 显示从ChildComponent接收到的数据 --><p>{{ message }}</p></div>
</template><script>
// 导入子组件Child
import Child from "./components/Child.vue";export default {data() {return {// 初始化message为空字符串,用于存储从子组件接收的数据message: ""}},methods: {// 定义fn方法来接收从子组件传递的数据fn(data) {this.message = data;}},components: {// 注册子组件ChildChild}
}
</script>

子组件(Child.vue)

<template><div><h3>组件传递数据</h3><!-- 调用onFnEvent方法并传递数据 --><p>{{ onFnEvent('测试数据') }}</p></div>
</template><script>
export default {props: {// 定义一个名为onFnEvent的prop,类型为FunctiononFnEvent: {type: Function}}
}
</script>

代码解释

  1. 父组件(ParentComponent.vue):

    • 在模板中,使用<Child :onFnEvent="fn" />标签引入子组件,并使用:onFnEvent="fn"来监听子组件触发的事件。

    • 当子组件触发事件时,父组件的fn方法会被调用,并接收子组件传递的数据。

    • message数据属性用于存储从子组件接收到的数据,并在模板中显示。

  2. 子组件(Child.vue):

    • 在模板中,调用onFnEvent方法并传递数据'测试数据'

    • 定义一个名为onFnEventprop,类型为Function,用于接收父组件传递的事件处理函数。

21、插槽 Slots

我们已经了解到组件能够接收任意类型的 JavaScript 值作为 props,但组件要如何接收模板内容呢?在某些场景中,我们可能 想要为子组件传递一些模板片段,让子组件在它们的组件中渲染这 些片段。

<solt>元素是一个插槽出口 (slot outlet),标示了父元素提供的插槽 内容 (slot content) 将在哪里被渲染.

父组件(ComponentA.vue)

<template><div><h3>ComponentA</h3><!-- 使用ComponentB,并在插槽中传递内容 --><ComponentB><h3>插槽传递视图内容</h3></ComponentB></div>
</template><script>
// 导入子组件ComponentB
import ComponentB from "./ComponentB.vue";export default {components: {// 注册子组件ComponentBComponentB}
}
</script>

子组件(ComponentB.vue)

<template><div><h3>ComponentB</h3><!-- 使用<slot>标签来接收从父组件传递的内容 --><slot></slot></div>
</template><script>
export default {// ComponentB不需要额外的逻辑,只需定义插槽
}
</script>

渲染作用域

插槽内容可以访问到父组件的数据作用域,因为插槽内容本身是在 父组件模板中定义的.

父组件(ComponentA.vue)

<template><div><h3>ComponentA</h3><!-- 使用ComponentB,并在插槽中传递内容 --><ComponentB><h3>{{ message }}</h3></ComponentB></div>
</template><script>
// 导入子组件ComponentB
import ComponentB from "./ComponentB.vue";export default {data() {return {// 定义message数据属性,用于存储要传递给子组件的内容message: "message在父级"}},components: {// 注册子组件ComponentBComponentB}
}
</script>

子组件(ComponentB.vue)

<template><div><h3>ComponentB</h3><!-- 使用<slot>标签来接收从父组件传递的内容 --><slot></slot></div>
</template><script>
export default {// ComponentB不需要额外的逻辑,只需定义插槽
}
</script>

默认内容

在外部没有提供任何内容的情况下,可以为插槽指定默认内容.

<template><div><h3>ComponentB</h3><!-- 使用<slot>标签定义插槽,并设置默认内容 --><slot>插槽默认值</slot></div>
</template><script>
export default {// ComponentB不需要额外的逻辑,只需定义插槽和默认值
}
</script>

具名插槽

父组件(ComponentA.vue)

<template><div><h3>ComponentA</h3><!-- 使用ComponentB,并为header和main插槽传递内容 --><ComponentB><template v-slot:header><h3>标题</h3></template><template v-slot:main><p>内容</p></template></ComponentB></div>
</template><script>
// 导入子组件ComponentB
import ComponentB from "./ComponentB.vue";export default {data() {return {// 定义message数据属性,虽然在这个例子中没有用到message: "message在父级"}},components: {// 注册子组件ComponentBComponentB}
}
</script>

子组件(ComponentB.vue)

<template><div><h3>ComponentB</h3><!-- 使用<slot>标签定义具名插槽header --><slot name="header"></slot><hr><!-- 使用<slot>标签定义具名插槽main --><slot name="main"></slot></div>
</template><script>
export default {// ComponentB不需要额外的逻辑,只需定义具名插槽
}
</script>

代码解释

  1. 父组件(ComponentA.vue):

    • 在模板中,使用<ComponentB>标签引入子组件,并为headermain插槽传递内容。

    • 使用<template v-slot:header><template v-slot:main>来指定内容应该填充到哪个插槽中。

    • ComponentB组件被注册在父组件的components对象中,使其可以在父组件的模板中使用。

  2. 子组件(ComponentB.vue):

    • 在模板中,使用<slot name="header"></slot><slot name="main"></slot>来定义具名插槽。这些插槽用于接收从父组件传递的内容。

    • 当父组件使用<ComponentB>标签并包含具名插槽的内容时,这些内容将替换子组件中的相应插槽标签。

 在Vue.js中,v-slot 指令用于定义插槽,而 # 符号是 v-slot 的简写形式,用于指定插槽的名称。

 父组件(ComponentA.vue)

<template><div><h3>ComponentA</h3><!-- 使用ComponentB,并为header和main插槽传递内容 --><ComponentB><template #header><h3>标题</h3></template><template #main><p>内容</p></template></ComponentB></div>
</template><script>
// 导入子组件ComponentB
import ComponentB from "./ComponentB.vue";export default {data() {return {// 定义message数据属性,用于存储要传递给子组件的内容message: "message在父级"}},components: {// 注册子组件ComponentBComponentB}
}
</script>

子组件(ComponentB.vue)

<template><div><h3>ComponentB</h3><!-- 使用<slot>标签定义具名插槽header --><slot name="header"></slot><hr><!-- 使用<slot>标签定义具名插槽main --><slot name="main"></slot></div>
</template><script>
export default {// ComponentB不需要额外的逻辑,只需定义具名插槽
}
</script>

在某些场景下插槽的内容可能想要同时使用父组件域内和子组件域内的数据。要做到这一点,我们需要一种方法来让子组件在渲染时 将一部分数据提供给插槽 我们也确实有办法这么做!可以像对组件传递 props 那样,向一个 插槽的出口上传递 attributes

父组件(ComponentA.vue)

<template><div><h3>ComponentA</h3><!-- 使用ComponentB,并通过具名插槽slotProps传递数据 --><componentB v-slot="slotProps"><h3>{{ message }}-{{ slotProps.text }}</h3></componentB></div>
</template><script>
// 导入子组件ComponentB
import ComponentB from "./ComponentB.vue";export default {data() {return {// 定义message数据属性,用于存储要传递给子组件的内容message: "message在父级"}},components: {// 注册子组件ComponentBComponentB}
}
</script>

子组件(ComponentB.vue)

<template><div><h3>ComponentB</h3><!-- 使用<slot>标签定义具名插槽,并传递message数据 --><slot :text="message"></slot></div>
</template><script>
export default {data() {return {// 定义message数据属性,用于存储子组件的数据message: "ComponentB中的数据"}}
}
</script>

代码解释

  1. 父组件(ComponentA.vue):

    • 在模板中,使用<componentB>标签引入子组件,并为slotProps插槽传递内容。

    • 使用<template v-slot="slotProps">来指定内容应该填充到哪个插槽中,并从子组件接收数据。

    • message数据属性用于存储要传递给子组件的内容。

    • ComponentB组件被注册在父组件的components对象中,使其可以在父组件的模板中使用。

  2. 子组件(ComponentB.vue):

    • 在模板中,使用<slot :text="message"></slot>来定义具名插槽。这个插槽用于接收从父组件传递的内容。

    • message数据属性用于存储子组件的数据,并通过插槽传递给父组件。

 具名插槽传递数据

<template><!-- 显示ComponentA的标题 --><h3>ComponentA</h3><!-- 使用ComponentB组件,并通过名为header的slot传递slotProps --><ComponentB #header="slotProps"><!-- 显示从父组件传递的消息和slotProps.text --><h3>{{ message }}-{{ slotProps.text }}</h3></ComponentB>
</template><script>
// 导入ComponentB组件
import ComponentB from "./ComponentB.vue"export default {data() {return {// 定义一个消息变量,用于在模板中显示message: "message在父级"}},// 定义组件对象,用于注册子组件components: {ComponentB}
}
</script>
<template><!-- 显示ComponentB的标题 --><h3>ComponentB</h3><!-- 使用slot,允许父组件通过名为header的slot传递内容 --><slot name="header" :text="message"></slot>
</template><script>
export default {data() {return {// 定义一个消息变量,用于在模板中显示message: "ComponentB中的数据"}}
}
</script>

22、组件生命周期

每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤,比如 设置好数据侦听,编译模板,挂载实例到 DOM,以及在数据改变 时更新 DOM。在此过程中,它也会运行被称为生命周期钩子的函 数,让开发者有机会在特定阶段运行自己的代码。

<template><!-- 显示组件生命周期的标题 --><h3>组件生命周期</h3><!-- 显示message数据 --><p>{{ message }}</p><!-- 一个按钮,点击时调用updateHandle方法更新数据 --><button @click="updateHandle">更新数据</button>
</template><script>
export default {// data函数返回一个对象,其中包含一个message属性,初始值为"老数据"data() {return {message: "老数据"}},// methods对象包含组件的方法methods: {// updateHandle方法更新message属性的值为"新数据"updateHandle() {this.message = "新数据"}},// 生命周期钩子函数beforeCreate() {// 在组件实例初始化之后调用,此时不能访问data中的属性console.log("组件创建之前");},created() {// 在实例创建完成后被立即调用,此时可以访问data中的属性console.log("组件创建之后");},beforeMount() {// 在挂载开始之前被调用,相关的render函数首次被调用console.log("组件渲染之前");},mounted() {// el被新创建的vm.$el替换,并挂载到实例上去之后调用该钩子console.log("组件挂载之后");},beforeUpdate() {// 数据更新之前调用,可以访问data中的属性,但是视图尚未更新console.log("数据更新之前");},updated() {// 数据更新之后调用,可以访问data中的属性,视图已经更新console.log("数据更新之后");},beforeUnmount() {// 实例销毁之前调用,此时可以访问data中的属性,但是视图已经销毁console.log("组件卸载之前");},unmounted() {// 实例销毁后调用,此时不能访问data中的属性console.log("组件卸载之后");}
}
</script>
  • beforeCreate:在组件实例初始化之后调用,此时不能访问data中的属性。

  • created:在实例创建完成后被立即调用,此时可以访问data中的属性。

  • beforeMount:在挂载开始之前被调用,相关的render函数首次被调用。

  • mounted:el被新创建的vm.$el替换,并挂载到实例上去之后调用该钩子。

  • beforeUpdate:数据更新之前调用,可以访问data中的属性,但是视图尚未更新。

  • updated:数据更新之后调用,可以访问data中的属性,视图已经更新。

  • beforeUnmount:实例销毁之前调用,此时可以访问data中的属性,但是视图已经销毁。

  • unmounted:实例销毁后调用,此时不能访问data中的属性。

生命周期应用

通过ref获取元素DOM结构

<template><!-- 模板部分 --><h3>组件生命周期应用</h3><!-- 一个段落元素,通过ref属性设置引用名为"name" --><p ref="name">哈哈哈</p>
</template><script>
export default {// beforeMount生命周期钩子beforeMount() {// 在这个阶段,DOM尚未渲染,因此$refs.name是undefinedconsole.log(this.$refs.name); // 输出:undefined},// mounted生命周期钩子mounted() {// 在这个阶段,DOM已经渲染完成,可以通过$refs访问模板中的DOM元素console.log(this.$refs.name); // 输出:<p ref="name">哈哈哈</p>的DOM元素}
}
</script>
  • beforeMount 生命周期钩子:在这个阶段,Vue 已经完成了模板的编译,但是还没有挂载 DOM 元素,因此 this.$refs.nameundefined

  • mounted 生命周期钩子:在这个阶段,Vue 已经完成了模板的挂载,DOM 元素已经创建并添加到页面中,因此可以通过 this.$refs.name 访问到 <p> 元素的 DOM 对象。

模拟网络请求渲染数据,页面加载后初始化数据

<template><!-- 模板部分 --><h3>组件生命周期应用</h3><!-- 使用v-for指令循环渲染banner数组中的每一项 --><ul><li v-for="(item, index) in banner" :key="index"><!-- 显示每一项的标题 --><h3>{{ item.title }}</h3><!-- 显示每一项的内容 --><p>{{ item.content }}</p></li></ul>
</template><script>
export default {// data函数返回一个对象,其中包含一个banner数组,初始为空data() {return {banner: []}},// mounted生命周期钩子mounted() {// 在组件挂载到DOM后,初始化banner数组this.banner = [{"title": "我在爱尔兰","content": "爱尔兰(爱尔兰语:Poblacht na hÉireann;英语:Republic of Ireland), 是一个西欧的议会共和制国家,西临大西洋,东靠爱尔兰海,与英国隔海相望,是北美通向欧洲的通道爱尔兰自然",},{"title": "一个人的东京","content": "东京(Tokyo)是日本国的首都,是亚洲第一大城市,世界第二大城市。全球最大的经济中心之一。东京的著名观光景点有东京铁塔、皇居、国会议事堂、浅草寺、浜离宫、上野公园与动物园",},{"title": "普罗旺斯的梦","content": "普罗旺斯(Provence)位于法国东南部,毗邻地中海和意大利,从地中海沿岸延伸到内陆的丘陵地区,中间有大河“Rhone”流过。自古就以靓丽的阳光和蔚蓝的天空,迷人的地中海和心醉",},{"title": "相约夏威夷之夏","content": "夏威夷州位于北太平洋中,距离美国本土3,700公里,总面积16,633平方公里,属于太平洋沿岸地区。首府为檀香山。在1778至1898年间,夏威夷也被称为“三明治群岛”(Sandwich Islands)",}]}
}
</script>

 23、动态组件

有些场景会需要在两个组件间来回切换,比如 Tab 界面

<template><h3>ComponentA</h3>
</template>
<template><h3>ComponentB</h3>
</template>
<template><!-- 模板部分 --><h3>组件切换</h3><!-- 使用 :is 绑定来动态切换组件 --><component :is="currentTab"></component><!-- 一个按钮,点击时调用 changeComponentHandle 方法切换组件 --><button @click="changeComponentHandle">切换</button>
</template><script>
// 导入ComponentA和ComponentB组件
import ComponentA from "./components/ComponentA.vue"
import ComponentB from "./components/ComponentB.vue"export default {// 注册ComponentA和ComponentB为本地组件components: {ComponentA,ComponentB},// data函数返回一个对象,其中包含一个currentTab属性,用于控制显示哪个组件data() {return {currentTab: "ComponentA", // 默认显示ComponentA}},// methods对象包含组件的方法methods: {// changeComponentHandle方法用于切换currentTab的值,从而切换组件changeComponentHandle() {this.currentTab = this.currentTab === "ComponentA" ? "ComponentB" : "ComponentA";}}
}
</script>
  • :is 是一个属性绑定,它用于动态地绑定组件的名称或路径。

 就相当于是<componentA/>

24、组件保持存活

当使用 <component :is="..."> 来在多个组件间作切换时,被切换掉的组件会被卸载。我们可以通过<keep-alive>组件强制被切换掉的组件仍然保持“存活”的状态,下一次使用该组件的时候需要重新渲染,浪费资源。

就是加个标签的事儿

<template><!-- 模板部分 --><h3>组件切换</h3><!-- 使用 <keep-alive> 包裹动态组件,保持切换组件的状态 --><keep-alive><!-- 使用 :is 绑定来动态切换组件 --><!-- 当 currentTab 变化时,Vue 将根据 currentTab 的值渲染对应的组件 --><component :is="currentTab"></component></keep-alive><!-- 一个按钮,点击时调用 changeComponentHandle 方法切换组件 --><!-- 这将改变 currentTab 的值,从而触发组件的切换 --><button @click="changeComponentHandle">切换</button>
</template><script>
// 导入ComponentA和ComponentB组件
import ComponentA from "./components/ComponentA.vue"
import ComponentB from "./components/ComponentB.vue"export default {// 注册ComponentA和ComponentB为本地组件,使其在模板中可用components: {ComponentA,ComponentB},// data函数返回一个对象,其中包含一个currentTab属性,用于控制显示哪个组件data() {return {currentTab: "ComponentA", // 默认显示ComponentA组件}},// methods对象包含组件的方法methods: {// changeComponentHandle方法用于切换currentTab的值,从而切换组件// 当按钮被点击时,这个方法会被调用changeComponentHandle() {// 使用三元运算符来切换currentTab的值// 如果当前是ComponentA,则切换到ComponentB,反之亦然this.currentTab = this.currentTab === "ComponentA" ? "ComponentB" : "ComponentA";}}
}
</script>
  • <keep-alive> 标签用于包裹动态组件 <component :is="currentTab"></component>。它的作用是保持组件的状态,即使组件被切换,之前的状态也不会丢失,这样可以提高性能,因为避免了不必要的组件销毁和重建。

 25、异步组件

在大型项目中,我们可能需要拆分应用为更小的块,并仅在需要时再从服务器加载相关组件。Vue 提供了 defineAsyncComponent方法来实现此功能

<template><!-- 模板部分 --><h3>组件切换</h3><!-- 使用 <keep-alive> 包裹动态组件,保持切换组件的状态 --><keep-alive><!-- 使用 :is 绑定来动态切换组件 --><!-- 当 currentTab 变化时,Vue 将根据 currentTab 的值渲染对应的组件 --><component :is="currentTab"></component></keep-alive><!-- 一个按钮,点击时调用 changeComponentHandle 方法切换组件 --><!-- 这将改变 currentTab 的值,从而触发组件的切换 --><button @click="changeComponentHandle">切换</button>
</template><script>
// 从 'vue' 导入 defineAsyncComponent 方法,用于定义异步组件
import { defineAsyncComponent } from 'vue'
// 导入 ComponentA 组件
import ComponentA from "./components/ComponentA.vue"
// 使用 defineAsyncComponent 定义异步加载的 ComponentB 组件
const AsyncComponentB = defineAsyncComponent(() =>import('./components/ComponentB.vue')
)export default {// 注册 ComponentA 和 AsyncComponentB 为本地组件,使其在模板中可用components: {ComponentA,AsyncComponentB},// data 函数返回一个对象,其中包含一个 currentTab 属性,用于控制显示哪个组件data() {return {currentTab: "ComponentA", // 默认显示 ComponentA 组件}},// methods 对象包含组件的方法methods: {// changeComponentHandle 方法用于切换 currentTab 的值,从而切换组件// 当按钮被点击时,这个方法会被调用changeComponentHandle() {// 使用条件运算符来切换 currentTab 的值// 如果当前是 ComponentA,则切换到 AsyncComponentB,反之亦然this.currentTab = this.currentTab == "ComponentA" ? "AsyncComponentB" : "ComponentA";}}
}
</script>
  1. 异步组件

    • 使用 defineAsyncComponent 方法定义了一个异步组件 AsyncComponentB。这允许 Vue 延迟加载 ComponentB.vue 文件,直到实际需要渲染该组件时才加载。

    • 异步组件在大型应用中非常有用,可以减少初始加载时间,提高性能。

26、依赖注入

通常情况下,当我们需要从父组件向子组件传递数据时,会使用 props。想象一下这样的结构:有一些多层级嵌套的组件,形成了一颗巨大的组件树,而某个深层的子组件需要一个较远的祖先组件中的部分数据。在这种情况下,如果仅使用 props 则必须将其沿着组件链逐级传递下去,这会非常麻烦 。

这一问题被称为“prop 逐级透传”

provide 和 inject 可以帮助我们解决这一问题。 一个父组件相对于其所有的后代组件,会作为依赖提供者。任何后代的组件树,无论层级有多深,都可以注入由父组件提供给整条链路的依赖 

<template><!-- 模板部分 --><h3>祖宗</h3> <!-- 显示“祖宗”标题 --><Parent /> <!-- 使用子组件 Parent -->
</template><script>
// 导入子组件 Parent
import Parent from "./components/Parent.vue"export default {// 使用 provide 提供一个 message,可以在子孙组件中通过 inject 访问provide: {message: "爷爷的财产"},// 注册子组件 Parent,使其在模板中可用components: {Parent}
}
</script>
<template><!-- 模板部分 --><h3>Parent</h3> <!-- 显示“Parent”标题 --><Child /> <!-- 使用子组件 Child -->
</template><script>
// 导入子组件 Child
import Child from "./Child.vue"export default {// 注册子组件 Child,使其在模板中可用components: {Child // 注册的组件名称与模板中使用的标签名称一致}
}
</script>

 

<template><!-- 模板部分 --><h3>Child</h3> <!-- 显示“Child”标题 --><p>{{ message }}</p> <!-- 显示从祖先组件注入的消息 -->
</template><script>
export default {// 使用 inject 选项来接收名为 message 的数据inject: ["message"]
}
</script>
  • provide/inject:这是 Vue 提供的一种跨组件通信方式,允许一个祖先组件向其所有子孙组件提供数据,而不必通过每个中间组件逐级传递 props。

  • provide 和 inject 只能由上到下的传递,不能反向传递

// 导入 Vue 的 createApp 函数
import { createApp } from 'vue'
// 导入根组件 App
import App from './App.vue'// 创建一个 Vue 应用实例
const app = createApp(App)// 使用 app.provide 提供全局数据
// 这里提供一个名为 "golabData" 的数据,值是 "我是全局数据"
app.provide("golabData", "我是全局数据")// 将 Vue 应用挂载到 id 为 'app' 的 DOM 元素上
app.mount('#app')

 

  • 使用 app.provide("golabData", "我是全局数据") 提供一个全局数据。这里 golabData 是一个键,"我是全局数据" 是这个键对应的值。任何组件都可以通过 inject 选项访问这个全局数据。

 27、Vue应用

vue从哪开始执行的?

每个 Vue 应用都是通过 createApp函数创建一个新的 应用实例

// 从 'vue' 导入 createApp 函数,用于创建 Vue 应用实例
import { createApp } from 'vue'
// 导入根组件 App
import App from './App.vue'// 创建 Vue 应用实例
// 在一个 Vue 项目中,通常只有一个 Vue 应用实例
const app = createApp(App)// 将 Vue 应用挂载到页面中 id 为 'app' 的元素上
app.mount('#app')

我们传入 createApp 的对象实际上是一个组件,每个应用都需要一个“根组件”,其他组件将作为其子组件。

import { createApp } from 'vue'
// 从一个单文件组件中导入根组件
import App from './App.vue'const app = createApp(App)

应用实例必须在调用了 .mount() 方法后才会渲染出来。该方法接收一个“容器”参数,可以是一个实际的 DOM 元素或是一个 CSS 选择器字符串.页面挂载到index.html文件上的id=app元素上。

app.mount('#app')
<div id="app"></div>

src目录下的assets文件夹的作用就是存放公共资源,例如:图片、公共CSS或者字体图标等. 

相关文章:

Vue基础(2)

19、组件之间传递数据 组件与组件之间不是完全独立的&#xff0c;而是有交集的&#xff0c;那就是组件与组 件之间是可以传递数据的 传递数据的解决方案就是 props ComponentA.vue <template><!-- 使用ComponentB组件&#xff0c;并传递title属性 --><h3>…...

Yearning开源MySQL SQL审核平台

一款MYSQL SQL语句/查询审计工具&#xff0c;为DBA与开发人员使用. 本地部署&#xff0c;注重隐私&#xff0c;简单高效的MYSQL审计平台。 它可以通过流程审批&#xff0c;实现真实线上环境sql的审核和执行&#xff0c;还可以回滚执行&#xff0c;能够确保线上SQL更新的可靠性…...

《鸿蒙Next应用商店:人工智能开启智能推荐与运营新时代》

在科技飞速发展的当下&#xff0c;鸿蒙Next系统的出现为操作系统领域带来了新的变革与机遇&#xff0c;而人工智能技术的融入更是让其应用商店的智能化推荐和运营迈向了一个全新的高度。 用户画像精准构建 在鸿蒙Next系统中&#xff0c;应用商店可以借助系统强大的权限管理和…...

SSTI注入

ssti漏洞成因 ssti服务端模板注入&#xff0c;ssti主要为python的一些框架 jinja2 mako tornado django&#xff0c;PHP框架smarty twig&#xff0c;java框架jade velocity等等使用了渲染函数时&#xff0c;由于代码不规范或信任了用户输入而导致了服务端模板注入&#xff0c;…...

根据经纬度查询地理位置信息API

API 概述 接口名称&#xff1a;查询地理位置信息V2接口类型&#xff1a;HTTP GET接口地址&#xff1a;https://api.kertennet.com/geography/locationInfo_v2请求编码格式&#xff1a;utf-8 请求说明 请求头部 标签类型必填说明参数示例Content-Typestring是请求的内容类型…...

【知识分享】PCIe5.0 TxRx 电气设计参数汇总

目录 0 引言 1 参考时钟--Refclk 2 发射端通道设计 3 发送均衡技术 4 接收端通道设计 5 接收均衡技术 6 结语 7 参考文献 8 扩展阅读 0 引言 PCI Express Base Specification 5.0的电气规范中&#xff0c;关键技术要点如下&#xff1a; 1. 支持2.5、5.0、8.0、16.0和3…...

Airsim 项目结构分析

Airsim 项目结构分析 本文只分析最核心的 AirLib 项目结构&#xff0c;以及其与 Unreal 项目的关系 假如已经根据 Airsim 主页&#xff0c;克隆了完整项目。 Build on Linux - AirSim 克隆源码 # go to the folder where you clone GitHub projects git clone https://git…...

STM32+W5500+以太网应用开发+003_TCP服务器添加OLED(u8g2)显示状态

STM32W5500以太网应用开发003_TCP服务器添加OLED&#xff08;u8g2&#xff09;显示状态 实验效果3-TCP服务器OLED1 拷贝显示驱动代码1.1 拷贝源代码1.2 将源代码添加到工程1.3 修改代码优化等级1.4 添加头文件路径1.5 修改STM32CubeMX工程 2 修改源代码2.1 添加头文件2.2 main函…...

SQLmap 注入-03 获得用户信息

1: Sqlmap 先进入库&#xff0c;然后进入table, 然后列出column: sqlmap -u "http://192.168.56.133/mutillidae/index.php?pageuser-info.php&usernamexiaosheng&passwordabc&user-info-php-submit-buttonViewAccountDetails" --batch -p username -D …...

Kafka 和 MQ 的区别

1.概述 1.1.MQ简介 消息中间件&#xff0c;其实准确的叫法应该叫消息队列&#xff08;message queue&#xff09;&#xff0c;简称MQ。其本质上是个队列&#xff0c;有FIFO的性质&#xff0c;即first in first out&#xff0c;先入先出。 目前市场上主流的MQ有三款&#xff…...

若依报错:无法访问com.ruoyi.common.annotation

无法访问com.ruoyi.common.annotation 若依的父工程的pom文件中设置了jdk为1.8&#xff0c;将idea的jdk也改为1.8即可。...

MCU、MPU、SOC、ECU、CPU、GPU的区别到底是什么

MCU、MPU、SOC、ECU、CPU、GPU的区别 参数MCUMPUSoCECUCPUGPU处理能力低至中中至高综合&#xff0c;视具体设计而定专用于汽车控制中至高高&#xff08;并行能力强&#xff09;集成度高低高高低&#xff08;需配合主板使用&#xff09;低&#xff08;通常作为外部设备&#xff…...

档案事业与数据要素之间有什么关系?

在数字时代背景下&#xff0c;档案事业正经历着前所未有的变革。随着大数据、云计算、人工智能等技术的快速发展&#xff0c;档案数据已成为重要的基础性战略资源和关键生产要素。那么档案事业与数据要素之间究竟有什么关系&#xff1f; 一、档案数据要素的内涵与价值 数据要…...

HarmonyOS NEXT:华为分享-碰一碰开发分享

随着科技的不断进步&#xff0c;智能手机和智能设备之间的互联互通变得越来越重要。华为作为科技行业的领军企业&#xff0c;一直致力于为用户提供更加便捷、高效的使用体验。HarmonyOS NEXT系统的推出&#xff0c;特别是其中的“碰一碰”功能&#xff0c;为用户带来了前所未有…...

nuxt3项目打包部署到服务器后配置端口号和开启https

nuxt3打包后的项目部署相对于一般vite打包的静态文件部署要稍微麻烦一些&#xff0c;还有一个主要的问题是开发环境配置的.env环境变量在打包后部署时获取不到&#xff0c;具体的解决方案可以参考我之前文章 nuxt3项目打包后获取.env设置的环境变量无效的解决办法。 这里使用的…...

面试:Hadoop,块,HDFS的优缺点,HDFS的读写流程

Hadoop CDH会简化Hadoop的安装 Hue主要用于数据分析和处理&#xff0c;而CM(Cloudera Manager)则主要用于集群的管理和运维。 HDFS HDFS的块 块是 HDFS 系统当中的最小存储单位, 在hadoop2.0和3.0中默认128MB 在HDFS上的文件会被拆分成多个块&#xff0c;每个块作为独立的单…...

Codeforces Round 903 (Div. 3) E. Block Sequence

题解&#xff1a; 想到从后向前DP f[i] 表示从 i ~ n 转化为“美观”所需要的最少的步骤 第一种转移方式&#xff1a;直接删除掉第i个元素&#xff0c;那么就是上一步 f[i 1] 加上 1;第二种转移方式&#xff1a;从第 i a[i] 1 个元素直接转移&#xff0c;不需要增加步数&a…...

web-view环境下,H5页面打开其他小程序

在Web-view环境下&#xff0c;H5页面无法直接打开其他小程序。正确的实现方式是先从H5页面跳转回当前小程序&#xff0c;再由当前小程序跳转到目标小程序。具体实现方法如下&#xff1a; H5页面跳转回小程序时&#xff0c;调用wx.miniProgram.navigateTo()方法。 小程序跳转到…...

C语言之饭店外卖信息管理系统

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 C语言之饭店外卖信息管理系统 目录 设计题目设计目的设计任务描述设计要求输入和输出要求验…...

【三维分割】Gaga:通过3D感知的 Memory Bank 分组任意高斯

文章目录 摘要一、引言二、主要方法2.1 3D-aware Memory Bank2.2 三维分割的渲染与下游应用 三、实验消融实验应用: Scene Manipulation 地址&#xff1a;https://www.gaga.gallery 标题&#xff1a;Gaga: Group Any Gaussians via 3D-aware Memory Bank 来源&#xff1a;加利福…...

【Linux系统】—— 编译器 gcc/g++ 的使用

【Linux系统】—— 编译器 gcc/g 的使用 1 用 gcc 直接编译2 翻译环境2.1 预处理&#xff08;进行宏替换&#xff09;2.2 编译&#xff08;生成汇编&#xff09;2.3 汇编&#xff08;生成机器可识别代码&#xff09;2.4 链接2.5 记忆小技巧2.6 编译方式2.7 几个问题2.7.1 如何理…...

读西瓜书的数学准备

1&#xff0c;高等数学&#xff1a;会求偏导数就行 2&#xff0c;线性代数&#xff1a;会矩阵运算就行 参考&#xff1a;线性代数--矩阵基本计算&#xff08;加减乘法&#xff09;_矩阵运算-CSDN博客 3&#xff0c;概率论与数理统计&#xff1a;知道啥是随机变量就行...

【数据结构篇】顺序表 超详细

目录 一.顺序表的定义 1.顺序表的概念及结构 1.1线性表 2.顺序表的分类 2.1静态顺序表 2.2动态顺序表 二.动态顺序表的实现 1.准备工作和注意事项 2.顺序表的基本接口&#xff1a; 2.0 创建一个顺序表 2.1 顺序表的初始化 2.2 顺序表的销毁 2.3 顺序表的打印 3.顺序…...

Flink把kafa数据写入Doris的N种方法及对比。

用Flink+Doris来开发实时数仓,首要解决是如何接入kafka实时流,下面是参考Doris官方文档和代码,在自己项目开发的实践中总结,包括一些容易踩坑的细节。 目录 Routine Load方法 接入kafka实时数据 踩坑的问题细节 Flink Doris Connector方法 完整示例 Routine Load方法…...

leetcode刷题记录(七十八)——105. 从前序与中序遍历序列构造二叉树

&#xff08;一&#xff09;问题描述 105. 从前序与中序遍历序列构造二叉树 - 力扣&#xff08;LeetCode&#xff09;105. 从前序与中序遍历序列构造二叉树 - 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一…...

imread和jpeg_read在MATLAB中处理图像时的不同

目录 1.功能差异 2.输出格式 3.颜色空间 4.处理阶段 5.用途 6.性能 1.功能差异 imread&#xff1a;这个函数用于读取各种格式的图像文件&#xff08;包括JPEG、PNG、BMP等&#xff09;并将其转换为MATLAB中的矩阵。它适用于读取图像并直接在空间域中进行处理。jpeg_read…...

P9069 [Ynoi Easy Round 2022] 堕天作战 TEST_98 Solution

Description 给定长为 n n n 的序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​)&#xff0c;有 m m m 个操作&#xff0c;分以下两种&#xff1a; modify ⁡ ( l , r , k ) \operatorname{modify}(l,r,k) modify(l,r,k)&#xff1a;对于所有…...

SCPI命令笔记

1. 读取设备信息 *IDN? 2. 复位仪器 *RST 3. 清除设备的状态寄存器和事件队列 *CLS 4. 读取设备数据(发一个指令&#xff0c;读取一次) READ? 5. 读取设备电压(功能和第4条命令达到一样的效果) MEAS:VOLT? 6. 读取设备电流 (功能和第4条命令达到一样的效果) MEAS:CURR? 7.…...

TCP创建通信前的三次握手(为啥不是两次?)

1.三次握手的过程 客户端发送 SYN&#xff08;同步&#xff09;报文 客户端向服务器发送 SYN 标志的数据包&#xff0c;请求建立连接&#xff0c;表示 "你好&#xff0c;我要连接你"。 服务器回复 SYNACK&#xff08;同步确认&#xff09;报文 服务器收到 SYN 后&am…...

2024.ailx10的年终总结

已经工作7年啦&#xff0c;今年网络安全行业愈发寒冷&#xff0c;几乎所有友商都在做安全GPT&#xff0c;说实话&#xff0c;AI确实颠覆了传统的网络安全运营&#xff0c;以前需要安服处置告警&#xff0c;以后可能就不需要了&#xff0c;大家日子都不好过&#xff0c;越是简单…...

洛谷P8837

[传智杯 #3 决赛] 商店 - 洛谷 代码区&#xff1a; #include<stdio.h> #include<stdlib.h> int cmp(const void*a,const void *b){return *(int*)b-*(int*)a; } int main(){int n,m;scanf("%d%d",&n,&m);int w[n];int c[m];for(int i0;i<n;…...

【Day23 LeetCode】贪心算法题

一、贪心算法 贪心没有套路&#xff0c;只有碰运气&#xff08;bushi&#xff09;&#xff0c;举反例看看是否可行&#xff0c;&#xff08;运气好&#xff09;刚好贪心策略的局部最优就是全局最优。 1、分发饼干 455 思路&#xff1a;按照孩子的胃口从小到大的顺序依次满足…...

以太网详解(五)GMII、RGMII、SGMII 接口时序约束(Quartus 平台)

文章目录 接口时序Avalon Streaming 接口时序Receive TimingTransmit Timing GMII 接口时序Receive TimingTransmit Timing RGMII 接口时序Receive TimingTransmit Timing 如何创建 .sdc 约束文件三速以太网系统时钟信号创建 set_input_delay&#xff0c;set_output_delay 约束…...

Java中的错误与异常详解

Java中的错误与异常详解 Java提供了一种机制来捕获和处理程序中的异常和错误。异常和错误都继承自 Throwable 类&#xff0c;但它们有着不同的用途和处理方式。 1. Error&#xff08;错误&#xff09; Error 是程序无法处理的严重问题&#xff0c;通常由 JVM&#xff08;Java…...

使用 HTML 开发 Portal 页全解析

前言 在当今数字化时代&#xff0c;网站作为企业和个人展示信息、提供服务的重要窗口&#xff0c;其重要性不言而喻。而 Portal 页&#xff0c;作为网站的核心页面之一&#xff0c;承担着引导用户、整合信息等关键任务。那么&#xff0c;如何使用 HTML 开发一个功能齐全、界面…...

高并发内存池_CentralCache(中心缓存)和PageCache(页缓存)申请内存的设计

三、CentralCache&#xff08;中心缓存&#xff09;_内存设计 &#xff08;一&#xff09;Span的创建 // 页编号类型&#xff0c;32位下是4byte类型&#xff0c;64位下是8byte类型 // #ifdef _WIN64 typedef unsigned long long PageID; #else _WIN32 typedef size_t PageI…...

Js:DOM中的样式(包含行内样式、滚动样式、可见区域样式等)

这部分还在更新 1、 获取行内样式&#xff1a;元素.style.样式名称 2、 获取当前正在显示的样式&#xff08;只能读&#xff0c;不能修改&#xff0c;想要修改要使用style&#xff09;&#xff1a; ① 只有ie支持&#xff1a;元素.currentStyle.样式名称 ② 其他浏览器&…...

【leetcode 26】28.找出字符串中第一个匹配项的下标 | 实现 strStr()==❗不会❗==

在一个串中查找是否出现过另一个串&#xff0c;这是KMP的看家本领。 // 方法一 class Solution {public void getNext(int[] next, String s){int j -1;next[0] j;for (int i 1; i < s.length(); i){while(j > 0 && s.charAt(i) ! s.charAt(j1)){jnext[j];}if…...

Unity自学之旅04

Unity自学之旅04 Unity自学之旅④&#x1f4dd; 跳跃&#x1f42f; 攻击&#x1f984; GUIGUI前置&#xff0c;显示收集物品数量和角色HpUGUI游戏暂停和重新开始 &#x1f917; 总结归纳 Unity自学之旅④ &#x1f4dd; 跳跃 public class PlayerBehaviorRigid : MonoBehavio…...

Unreal Engine 5 C++ Advanced Action RPG 十章笔记

第十章 Survival Game Mode 2-Game Mode Test Map 设置游戏规则进行游戏玩法 生成敌人玩家是否死亡敌人死亡是否需要刷出更多 肯定:难度增加否定:玩家胜利 流程 新的游戏模式类游戏状态新的数据表来指定总共有多少波敌人生成逻辑UI告诉当前玩家的敌人波数 3-Survival Game M…...

[Unity 热更方案] 使用Addressable进行打包管理, 使用AssetBundle进行包的加载管理.70%跟练

在正常的开发过程中我们经常遇到一些关于热更的方案,有一些已有的方案供我们选择,但是实机情况往往不尽如人意,各有优缺点. 现在我们同样有一个热更的需求,但是要求打包简单,加载过程可查,防止出现一些资源和流程的问题. 下面介绍我在项目中使用的方案. 打包方面使用Addressabl…...

人工智能领域单词:英文解释

目录 1、前言2、单词组1&#xff1a;15个3、单词组2&#xff1a;15个4、单词组3&#xff1a;15个5、单词组4&#xff1a;15个6、单词组5&#xff1a;15个 1、前言 亲爱的家人们&#xff0c;创作很不容易&#xff0c;若对您有帮助的话&#xff0c;请点赞收藏加关注哦&#xff0…...

工业网口相机:如何通过调整网口参数设置,优化图像传输和网络性能,达到最大帧率

项目场景 工业相机是常用与工业视觉领域的常用专业视觉核心部件&#xff0c;拥有多种属性&#xff0c;是机器视觉系统中的核心部件&#xff0c;具有不可替代的重要功能。 工业相机已经被广泛应用于工业生产线在线检测、智能交通,机器视觉,科研,军事科学,航天航空等众多领域 …...

NextJs - ServerAction获取文件并处理Excel

NextJs - ServerAction获取文件并处理Excel 一. 客户端二. ServerAction 处理 一. 客户端 use client; import { uploadExcel } from actions/batchInquirySystem/api; import type { UploadProps } from antd; import { Upload } from antd;/*** 创建问询内容*/ const Page …...

【深度学习项目】语义分割-FCN网络(原理、网络架构、基于Pytorch实现FCN网络)

文章目录 介绍深度学习语义分割的关键特点主要架构和技术数据集和评价指标总结 FCN网络FCN 的特点FCN 的工作原理FCN 的变体和发展FCN 的网络结构FCN 的实现&#xff08;基于Pytorch&#xff09;1. 环境配置2. 文件结构3. 预训练权重下载地址4. 数据集&#xff0c;本例程使用的…...

集群、分布式及微服务间的区别与联系

目录 单体架构介绍集群和分布式架构集群和分布式集群和分布式区别和联系 微服务架构的引入微服务带来的挑战 总结 单体架构介绍 早期很多创业公司或者传统企业会把业务的所有功能实现都打包在一个项目中&#xff0c;这种方式就称为单体架构 以我们都很熟悉的电商系统为例&…...

ConvBERT:通过基于跨度的动态卷积改进BERT

摘要 像BERT及其变体这样的预训练语言模型最近在各种自然语言理解任务中取得了令人印象深刻的性能。然而&#xff0c;BERT严重依赖于全局自注意力机制&#xff0c;因此存在较大的内存占用和计算成本。尽管所有的注意力头都从全局角度查询整个输入序列以生成注意力图&#xff0…...

C# 网络协议第三方库Protobuf的使用

为什么要使用二进制数据 通常我们写一个简单的网络通讯软件可能使用的最多的是字符串类型&#xff0c;比较简单&#xff0c;例如发送格式为(head)19|Msg:Heart|100,x,y,z…&#xff0c;在接收端会解析收到的socket数据。 这样通常是完全可行的&#xff0c;但是随着数据量变大&…...

「2024 博客之星」自研Java框架 Sunrays-Framework 使用教程

文章目录 0.序言我的成长历程遇到挫折&#xff0c;陷入低谷重拾信心&#xff0c;迎接未来开源与分享我为何如此看重这次评选最后的心声 1.概述1.主要功能2.相关链接 2.系统要求构建工具框架和语言数据库与缓存消息队列与对象存储 3.快速入门0.配置Maven中央仓库1.打开settings.…...

【Elasticsearch】Springboot编写Elasticsearch的RestAPI

RestAPI 初始化RestClient创建索引库Mapping映射 判断索引库是否存在删除索引库总结 ES官方提供了各种不同语言的客户端&#xff0c;用来操作ES。这些客户端的本质就是组装DSL语句&#xff0c;通过http请求发送给ES。 官方文档地址 由于ES目前最新版本是8.8&#xff0c;提供了全…...