vue3中的基本语法

目录

基础素材

vue3的优化

使用CompositionAPI理由

1. reactive() 函数

2. ref() 函数

2.1. ref的使用

2.2. 在 reactive 对象中访问 ref 创建的响应式数据

3. isRef() 函数

4. toRefs() 函数

5. computed()

5.1. 通过 set()、get()方法创建一个可读可写的计算属性

6. watch() 函数

6.1. 监听用 reactive 声明的数据源

6.2. 监听用 ref 声明的数据源

6.3. 同时监听多个值

6.4. stop 停止监听

7. LifeCycle Hooks(新的生命周期)

8. Template refs

9. vue 的全局配置

10. Suspense组件

11. vuex, router, vue 初始化写法的变化

11.1. vue

11.2. router

11.2.1. 特点:

11.2.2. 使用

12. vuex

12.1. 使用

13. 组件注入

13.1. 父组件

13.2. 子组件

14. vue 3.x 完整组件模版结构


基础素材

印记中文|印记中文 - 深入挖掘国外前端新领域,为中国 Web 前端开发人员提供优质文档!

vue3官网 | 简介 | Vue.js

pina|介绍 | Pinia 中文文档

vue3的优化

  1. 对虚拟 DOM 进行了重写、模板编译速度的提升,对静态数据的跳过处理
  2. 对数组的监控
  3. 对ts有了很好的支持
  4. 对2.x版本的完全兼容
  5. 可以有多个根节点(也有bug,比如外层开了display:flex 那么里面会收到影响,也就是说布局更灵活但也更要小心,总之请对自己与他人的代码负责) 6. 支持Source map,虽然没演示但是这点真的重要 7. vue2 大量的 API 挂载在 Vue 对象的原型上,难以实现 TreeShaking

使用CompositionAPI理由

  • 更好的Typescript支持
  • 在复杂功能组件中可以实现根据特性组织代码 - 代码内聚性。比如:排序和搜索逻辑内聚
  • 组件间代码复用

经过了漫长的迭代,Vue 3.0 终于在上 2020-09-18 发布了,带了翻天覆地的变化,使用了 Typescript 进行了大规模的重构,带来了 Composition API RFC 版本,类似 React Hook 一样的写 Vue,可以自定义自己的 hook ,让使用者更加的灵活。

  1. setup()
  2. ref()
  3. reactive()
  4. isRef()
  5. toRefs()
  6. computed()
  7. watch()
  8. LifeCycle Hooks(新的生命周期)
  9. Template refs
  10. globalProperties
  11. Suspense

1. reactive() 函数

reactive() 函数接收一个普通对象,返回一个响应式的数据对象,想要使用创建的响应式数据也很简单,创建出来之后,在 setup 中 return 出去,在 template 中调用即可

<template>{{state.name}} // test
<template>
<script>
import { defineComponent, reactive, ref, toRefs } from 'vue';
export default defineComponent({setup(props, context) {let state = reactive({name: 'test'});return state}
});
</script>

2. ref() 函数

2.1. ref的使用

ref() 函数用来根据给定的值创建一个响应式的数据对象,ref() 函数调用的返回值是一个对象,这个对象上只包含一个 value 属性,只在 setup 函数内部访问 ref 函数需要加 .value

<template><div class="mine">{{count}} // 10</div>
</template>
<script>
import { defineComponent, ref } from 'vue';
export default defineComponent({setup() {const count = ref(10)// 在js 中获取ref 中定义的值, 需要通过value属性console.log(count.value);return {count}}
});
</script>

2.2. 在 reactive 对象中访问 ref 创建的响应式数据

通过reactive 来获取ref 的值时,不需要使用.value属性

<template><div class="mine">{{count}} -{{t}} // 10 -100</div>
</template>
<script>
import { defineComponent, reactive, ref, toRefs } from 'vue';
export default defineComponent({setup() {const count = ref<number>(10)const obj = reactive({t: 100,count})// 通过reactive 来获取ref 的值时,不需要使用.value属性console.log(obj.count);return {...toRefs(obj)}}
});
</script>

3. isRef() 函数

isRef() 用来判断某个值是否为 ref() 创建出来的对象

<script>
import { defineComponent, isRef, ref } from 'vue';
export default defineComponent({setup(props, context) {const name = 'vue'const age = ref(18)console.log(isRef(age)); // trueconsole.log(isRef(name)); // falsereturn {age,name}}
});
</script>

4. toRefs() 函数

toRefs() 函数可以将 reactive() 创建出来的响应式对象,转换为普通的对象,只不过,这个对象上的每个属性节点,都是 ref() 类型的响应式数据

<template><div class="mine">{{name}} // test{{age}} // 18</div>
</template>
<script>
import { defineComponent, reactive, ref, toRefs } from 'vue';
export default defineComponent({setup(props, context) {let state = reactive({name: 'test'});const age = ref(18)return {...toRefs(state),age}}
});
</script>

5. computed()

该函数用来创造计算属性,和过去一样,它返回的值是一个 ref 对象。

里面可以传方法,或者一个对象,对象中包含 set()、get()方法。

<script>
import { computed, defineComponent, ref } from 'vue';
export default defineComponent({setup(props, context) {const age = ref(18)// 根据 age 的值,创建一个响应式的计算属性 readOnlyAge,它会根据依赖的 ref 自动计算并返回一个新的 refconst readOnlyAge = computed(() => age.value++) // 19return {age,readOnlyAge}}
});
</script>// 组合式
<script setup>
import { reactive, computed } from 'vue'const author = reactive({name: 'John Doe',books: ['Vue 2 - Advanced Guide','Vue 3 - Basic Guide','Vue 4 - The Mystery']
})// 一个计算属性 ref
const publishedBooksMessage = computed(() => {return author.books.length > 0 ? 'Yes' : 'No'
})
</script>
<template><p>Has published books:</p><span>{{ publishedBooksMessage }}</span>
</template>

5.1. 通过 set()、get()方法创建一个可读可写的计算属性

<script>
import { computed, defineComponent, ref } from 'vue';
export default defineComponent({setup(props, context) {const age = ref(18)const computedAge = computed({get: () => age.value + 1,set: value => age.value + value})// 为计算属性赋值的操作,会触发 set 函数, 触发 set 函数后,age 的值会被更新age.value = 100return {age,computedAge}}
});
</script>

6. watch() 函数

watch 函数用来侦听特定的数据源,并在回调函数中执行副作用。

默认情况是懒执行的,也就是说仅在侦听的源数据变更时才执行回调。

6.1. 监听用 reactive 声明的数据源

<script>
import { computed, defineComponent, reactive, toRefs, watch } from 'vue';export default defineComponent({setup(props, context) {const state = reactive({ name: 'vue', age: 10 })watch(() => state.age,(age, preAge) => {console.log(age); // 100console.log(preAge); // 10})// 修改age 时会触发 watch 的回调, 打印变更前后的值state.age = 100return {...toRefs(state)}}
});
</script>

6.2. 监听用 ref 声明的数据源

<script>
import { defineComponent, ref, watch } from 'vue';
export default defineComponent({setup(props, context) {const age = ref(10);watch(age, () => console.log(age.value)); // 100// 修改age 时会触发watch 的回调, 打印变更后的值age.value = 100return {age}}
});
</script>

6.3. 同时监听多个值

<script>
import { computed, defineComponent, reactive, toRefs, watch } from 'vue';export default defineComponent({setup(props, context) {const state = reactive({ name: 'vue', age: 10 })watch([() => state.age, () => state.name],([newName, newAge], [oldName, oldAge]) => {console.log(newName);console.log(newAge);console.log(oldName);console.log(oldAge);})// 修改age 时会触发watch 的回调, 打印变更前后的值, 此时需要注意, 更改其中一个值, 都会执行watch的回调state.age = 100state.name = 'vue3'return {...toRefs(state)}}
});
</script>

6.4. stop 停止监听

在 setup() 函数内创建的 watch 监视,会在当前组件被销毁的时候自动停止。

如果想要明确地停止某个监视,可以调用 watch() 函数的返回值即可,语法如下:

<script>
import { set } from 'lodash';
import { computed, defineComponent, reactive, toRefs, watch } from 'vue';
export default defineComponent({setup(props, context) {const state = reactive({ name: 'vue', age: 10 })const stop =  watch([() => state.age, () => state.name],([newName, newAge], [oldName, oldAge]) => {console.log(newName);console.log(newAge);console.log(oldName);console.log(oldAge);})// 修改age 时会触发 watch 的回调, 打印变更前后的值, 此时需要注意, 更改其中一个值, 都会执行watch的回调state.age = 100state.name = 'vue3'setTimeout(()=> {stop()// 此时修改时, 不会触发watch 回调state.age = 1000state.name = 'vue3-'}, 1000) // 1秒之后将取消watch的监听return {...toRefs(state)}}
});
</script>

7. LifeCycle Hooks(新的生命周期)

新版的生命周期函数,可以按需导入到组件中,且只能在 setup() 函数中使用,但是也可以在 setup 外定义,在 setup 中使用\

<script>
import { set } from 'lodash';
import { defineComponent, onBeforeMount, onBeforeUnmount, onBeforeUpdate, onErrorCaptured, onMounted, onUnmounted, onUpdated } from 'vue';
export default defineComponent({setup(props, context) {onBeforeMount(()=> {console.log('beformounted!')})onMounted(() => {console.log('mounted!')})onBeforeUpdate(()=> {console.log('beforupdated!')})onUpdated(() => {console.log('updated!')})onBeforeUnmount(()=> {console.log('beforunmounted!')})onUnmounted(() => {console.log('unmounted!')})onErrorCaptured(()=> {console.log('errorCaptured!')})return {}}
});
</script>

8. Template refs

通过 refs 来获取真实 dom 元素,这个和 react 的用法一样,为了获得对模板内元素或组件实例的引用,我们可以像往常一样在 setup()中声明一个 ref 并返回它

<div><div ref="content">第一步, 在dom上面定义, 他会有一个回调</div></div><ul><li>v-for 出来的ref</li><li>可以写为表达式的形式, 可以推导出vue是如何实现的</li><li>vue2.x的时候v-for不用这么麻烦, 直接写上去会被组装成数组</li><li :ref="el => { items[index] = el }" v-for="(item,index) in 6" :key="item">{{item}}</li></ul>

9. vue 的全局配置

通过 vue 实例上 config 来配置,包含 Vue 应用程序全局配置的对象。您可以在挂载应用程序之前修改下面列出的属性:

您可以在挂载应用程序之前修改下面列出的属性:

const app = Vue.createApp({})
app.config = {...}//为组件渲染功能和观察程序期间的未捕获错误分配处理程序。//错误和应用程序实例将调用处理程序:
app.config.errorHandler = (err, vm, info) => {}

可以在应用程序内的任何组件实例中访问的全局属性,组件的属性将具有优先权。

这可以代替 Vue 2.xVue.prototype 扩展:

const app = Vue.createApp({})
app.config.globalProperties.$http = 'xxxxxxxxs'

可以在组件用通过 getCurrentInstance() 来获取全局 globalProperties 中配置的信息,getCurrentInstance() 方法获取当前组件的实例,然后通过 ctx 属性获得当前上下文,这样我们就能在 setup 中使用 router 和 vuex,通过这个属性我们就可以操作变量、全局属性、组件属性等等。

setup( ) {   const { ctx } = getCurrentInstance();   ctx.$http }

10. Suspense组件

在开始介绍 Vue 的 Suspense 组件之前,我们有必要先了解一下 React 的 Suspense 组件,因为他们的功能类似。

React.lazy 接受一个函数,这个函数需要动态调用 import()。

它必须返回一个 Promise,该 Promise 需要 resolve 一个 default export 的 React 组件。

import React, { Suspense } from 'react';
const myComponent = React.lazy(() => import('./Component'));
function MyComponent() {return (<div><Suspense fallback={<div>Loading...</div>}><myComponent /></Suspense></div>);
}

Vue3 也新增了 React.lazy 类似功能的 defineAsyncComponent 函数,处理动态引入(的组件)。

defineAsyncComponent 可以接受返回承诺的工厂函数。

当您从服务器检索到组件定义时,应该调用 Promise 的解析回调。

您还可以调用 reject(reason) 来指示负载已经失败。

import { defineAsyncComponent } from 'vue'
const AsyncComp = defineAsyncComponent(() =>import('./components/AsyncComponent.vue')
)
app.component('async-component', AsyncComp)

Vue3 也新增了 Suspense 组件:

  1. 异步组件加载状态管理:可以通过 Suspense 组件来指定一个 loading 插槽,在异步组件加载过程中
  2. 错误处理:可以在 Suspense 组件中使用 error 插槽来处理异步组件加载过程中可能发生的错误,并展示相关信息
  3. 多个异步组件加载状态管理:能够同时管理多个异步组件的加载状态,在任意一个异步组件加载时展示 loading 状态,而其他未加载的组件仍然保持正常
<template><Suspense><template #default><my-component /></template><template #fallback>Loading ...</template></Suspense>
</template>
<script>import { defineComponent, defineAsyncComponent } from "vue";const MyComponent = defineAsyncComponent(() => import('./Component'));
export default defineComponent({components: {MyComponent},setup() {return {}}
})
</script>

11. vuex, router, vue 初始化写法的变化

11.1. vue

import { createApp } from 'vue';
import App from './App.vue'
import router from './router'
import store from './store'// 方法一. 创建实例变成了链式, 直接写下去感觉语义与结构有点模糊, 但是我们要理解vue这样做的良苦用心, 前端趋近于函数化。
// createApp(App).use(router).use(store).mount('#app')// 方法二.
const app = createApp(App);
app.use(router);
app.use(store);
app.mount('#app');

11.2. router

history 关键字:createWebHistory

history模式直接指向history对象,它表示当前窗口的浏览历史,history对象保存了当前窗口访问过的所有页面网址。URL中没有#,它使用的是传统的路由分发模式,即用户在输入一个URL时,服务器会接收这个请求,并解析这个URL,然后做出相应的逻辑处理。

11.2.1. 特点:

当使用history模式时,URL就像这样:hhh.com/user/id。相比hash模式更加好看。

虽然history模式不需要#。但是,它也有自己的缺点,就是在刷新页面的时候,如果没有相应的路由或资源,就会刷出404来。

history api可以分为两大部分,切换历史状态 和 修改历史状态:

import { createRouter, createWebHistory } from 'vue-router';
import Home from '../views/Home.vue'const routes = [{path: '/',name: 'Home',component: Home}
]const router = createRouter({// 专门创建history的函数history: createWebHistory(process.env.BASE_URL),routes
})export default router
11.2.2. 使用
<template><div>{{id}}</div>
</template><script>
import { getCurrentInstance, ref } from 'vue';
export default {setup(){const { ctx } = getCurrentInstance()// 1. 这样也是为了去掉this// 2. 方便类型推导console.log(ctx.$router); // push等方法console.log(ctx.$router.currentRoute.value); // 路由实例// 这个其实没有必要变成ref因为这个值没必要动态// 但是他太长了, 这个真的不能忍const id = ref(ctx.$router.currentRoute.value.query.id)// 4: 页面拦截器ctx.$router.beforeEach((to, from,next)=>{console.log('路由的生命周期')next()})return {id}}
}
</script>

12. vuex

import { createStore } from 'vuex'
// 专门创建实例的一个方法
export default createStore({state: {},mutations: {},actions: {},modules: {}
});

12.1. 使用

import { createStore } from 'vuex'// 难道前端趋势只有函数这一种吗
export default createStore({state: {name:'牛逼, 你拿到我了',age: 24,a:'白',b:'黑'},mutations: {updateName(state, n){state.name += n}},actions: {deferName(store) {setTimeout(()=>{// 必须只有commit可以修改值, 这个设定我比较反对, 可以讨论// vuex本身结构就很拖沓, 定义域使用个人都不喜欢store.state.name = '牛逼, 你改回来了'},1000)}},getters: {fullName(state){ return `${state.a} - + -${state.b}` }},modules: {}
});
<template><div><p>{{name}}</p><button @click="updateName('+')">点击改变名字</button><button @click="deferName('+')">改回来</button><p>{{fullName}}</p></div>
</template><script>
import { useStore } from "vuex";
import { computed } from "vue";
export default {setup() {const store = useStore();// 1: 单个引入const name = computed(() => store.state.name);// 2: 引入整个stateconst state = computed(() => store.state);console.log("vuex的实例", state.value); // 别忘了.value// 3: 方法其实就直接从本体上取下来了const updateName = newName => store.commit("updateName", newName);// 4: action一个意思const deferName = () => store.dispatch("deferName");// 5: getter 没变化const fullName = computed(() => store.getters.fullName);return {name,fullName,deferName,updateName,};}
};
</script>

13. 组件注入

13.1. 父组件

<template><div>组件:<zj :type="type" @ok="wancheng"></zj></div>
</template><script>
import zj from "../components/子组件.vue";
import { ref } from 'vue';
import { provide } from 'vue'export default {components: { zj},setup() {provide('name','向下传值'); // 基础值provide('name2', ref('向下传值')); // 监控值const type = ref('大多数');function wancheng(msg){console.log('子组件-->',msg)setTimeout(()=>{type.value = 'xxxxxxx'},2000)}return {type,wancheng}}
};
</script>

13.2. 子组件

<template><div>props的属性不用setup去return --- {{type}}</div>
</template><script>
import { inject, ref } from 'vue'
export default {props: {type: String},// 1: props也是不可以解构的, 会失去响应式// 2: context是上下文, 我们可以获取到slots emit 等方法// 3: props, context 分开也是为了ts更明确的类型推导// setup({type}){setup(props, context) {// 1: propsconsole.log("props", props.type);console.log("上下文", context);context.emit('ok','传递完成');// 2: 注入console.log('inject',inject('name'));console.log('inject',inject('xxxx','我是默认值'))inject('name1', ref('默认值')) // 接收方也可以这样}
};
</script>

14. vue 3.x 完整组件模版结构

一个完成的 vue 3.x 完整组件模版结构包含了:组件名称、 props、components、setup(hooks、computed、watch、methods 等)

<template><div class="mine" ref="elmRefs"><span>{{name}}</span><br><span>{{count}}</span><div><button @click="handleClick">测试按钮</button></div><ul><li v-for="item in list" :key="item.id">{{item.name}}</li></ul></div>
</template>
<script lang="ts">
import { computed, defineComponent, getCurrentInstance, onMounted, PropType, reactive, ref, toRefs } from 'vue';
interface IState {count: 0,name: string,list: Array<object>
}
export default defineComponent({name: 'demo',// 父组件传子组件参数props: {name: {type: String as PropType<null | ''>,default: 'vue3.x'},list: {type: Array as PropType<object[]>,default: () => []}},components: {/// TODO 组件注册},emits: ["emits-name"], // 为了提示作用setup (props, context) {console.log(props.name)console.log(props.list)const state = reactive<IState>({name: 'vue 3.0 组件',count: 0,list: [{name: 'vue',id: 1},{name: 'vuex',id: 2}]})const a = computed(() => state.name)onMounted(() => {})function handleClick () {state.count ++// 调用父组件的方法context.emit('emits-name', state.count)}return {...toRefs(state),handleClick}}
});
</script>

在通往幸福道路上,并没有什么捷径可走,唯有付出努力和拼搏

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

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

相关文章

函数——递归6(c++)

角谷猜想 题目描述 日本一位中学生发现一个奇妙的 定理&#xff0c;请角谷教授证明&#xff0c;而教授 无能为力&#xff0c;于是产生了角谷猜想。 猜想的内容&#xff1a;任给一个自然数&#xff0c; 若为偶数则除以2&#xff0c;若为奇数则乘 3加1&#xff0c;得到一个新的…

PyTorch深度学习快速入门

PyTorch深度学习快速入门 1.PyTorch环境配置及安装2.python编辑器的选择、安装、配置&#xff08;pycharm、JupyTer安装&#xff09;3.为什么torch.cuda.is_available()返回false4.python学习中两大法宝函数&#xff08;也可用在pytorch&#xff09;5.pycharm和jupyter&#xf…

golang goroutine 如何退出?

上一讲说到调度器将maingoroutine推上舞台&#xff0c;为它铺好了道路&#xff0c;开始执行runtime.main函数。这一讲&#xff0c;我们探索maingoroutine以及普通goroutine从执行到退出的整个过程。 //Themaingoroutine. funcmain(){ //gmaingoroutine&#xff0c;不再是g0了 …

Python列表中添加删除元素不走弯路

1.append() 向列表中添加单个元素&#xff0c;一般用于尾部追加 list1 ["香妃", "乾隆", "贾南风", "赵飞燕", "汉武帝"]list1.append("周瑜") print(list1) # [香妃, 乾隆, 贾南风, 赵飞燕, 汉武帝, 周瑜]…

STM32标准库——(14)I2C通信协议、MPU6050简介

1.I2C通信 I2C 通讯协议(Inter&#xff0d;Integrated Circuit)是由Phiilps公司开发的&#xff0c;由于它引脚少&#xff0c;硬件实现简单&#xff0c;可扩展性强&#xff0c; 不需要USART、CAN等通讯协议的外部收发设备&#xff0c;现在被广泛地使用在系统内多个集成电路(IC)间…

计算机网络_2.2物理层下面的传输媒体

2.2物理层下面的传输媒体 一、传输媒体的分类二、导向型传输媒体1、同轴电缆2、双绞线3、光纤&#xff08;1&#xff09;光纤通信原理&#xff08;2&#xff09;光纤组成&#xff08;4&#xff09;多模光纤与单模光纤对比&#xff08;5&#xff09;光纤的波长与规格&#xff08…

数据可视化基础与应用-02-基于powerbi实现连锁糕点店数据集的仪表盘制作

总结 本系列是数据可视化基础与应用的第02篇&#xff0c;主要介绍基于powerbi实现一个连锁糕点店数据集的仪表盘制作。 数据集描述 有一个数据集&#xff0c;包含四张工作簿&#xff0c;每个工作簿是一张表&#xff0c;其中可以销售表可以划分为事实表&#xff0c;产品表&am…

Linux时间同步(PPS、PTP、chrony)分析笔记

1 PPS(pulse per second) 1.1 简介 LinuxPPS provides a programming interface (API) to define in the system several PPS sources. PPS means "pulse per second" and a PPS source is just a device which provides a high precision signal each second so t…

每日一题 2673使二叉树所有路径值相等的最小代价

2673. 使二叉树所有路径值相等的最小代价 题目描述&#xff1a; 给你一个整数 n 表示一棵 满二叉树 里面节点的数目&#xff0c;节点编号从 1 到 n 。根节点编号为 1 &#xff0c;树中每个非叶子节点 i 都有两个孩子&#xff0c;分别是左孩子 2 * i 和右孩子 2 * i 1 。 树…

Java缓存简介

内存访问速度和硬盘访问速度是计算机系统中两个非常重要的性能指标。 内存访问速度&#xff1a;内存是计算机中最快的存储介质&#xff0c;它的访问速度可以达到几纳秒级别。内存中的数据可以直接被CPU访问&#xff0c;因此读写速度非常快。 硬盘访问速度&…

学习和工作的投入产出比(节选)

人工智能统领全文 推荐包含关于投入、产出、过剩、市场关注、案例、结果和避雷等主题的信息&#xff1a; 投入与产出&#xff1a; 投入和产出都有直接和间接两类常见形式。常见的四种组合是&#xff1a;直接投入、直接产出、间接投入、间接产出。 过剩&#xff1a; 过剩是一个重…

力扣SQL50 无效的推文 查询

Problem: 1683. 无效的推文 思路 &#x1f468;‍&#x1f3eb; 参考 char_length(str)&#xff1a;计算 str 的字符长度length(str)&#xff1a;计算 str 的字节长度 Code select tweet_id from Tweets where char_length(content) > 15;

C++与 Fluke5500A设备通过GPIB-USB-B通信的经验积累

C与 Fluke5500A设备通过GPIB-USB-B通信的经验积累 以下内容来自&#xff1a;C与 Fluke5500A设备通过GPIB-USB-B通信的经验积累 - JMarcus - 博客园 (cnblogs.com)START 1.需要安装NI-488.2.281&#xff0c;安装好了之后&#xff0c;GPIB-USB-B的驱动就自动安装好了 注意版本…

动态规划(算法竞赛、蓝桥杯)--单调队列滑动窗口与连续子序列的最大和

1、B站视频链接&#xff1a;E11【模板】单调队列 滑动窗口最值_哔哩哔哩_bilibili 题目链接&#xff1a;滑动窗口 /【模板】单调队列 - 洛谷 #include <bits/stdc.h> using namespace std; const int N1000010; int a[N],q[N];//q存的是元素的下标 int main(){int n,k;…

unity学习(41)——创建(create)角色脚本(panel)——UserHandler(收)+CreateClick(发)——创建发包!

1.客户端的程序结构被我精简过&#xff0c;现在去MessageManager.cs中增加一个UserHandler函数&#xff0c;根据收到的包做对应的GameInfo赋值。 2.在Model文件夹下新增一个协议文件UserProtocol&#xff0c;内容很简单。 using System;public class UserProtocol {public co…

金融短信群发平台具有那些特点

金融短信群发平台的特点主要包括以下几个方面&#xff1a; 1.高效性&#xff1a;金融短信群发平台能够快速地发送大量的短信&#xff0c;使得金融信息能够迅速传达给目标客户&#xff0c;保证了信息的及时性和有效性。 2.安全性&#xff1a;金融短信群发平台对于信息的安全性非…

蓝桥杯练习系统(算法训练)ALGO-995 24点

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 24点游戏是一个非常有意思的游戏&#xff0c;很流行&#xff0c;玩法很简单&#xff1a;给你4张牌&#xff0c;每张牌上有数…

【教程】移动互联网时代的APP上架流程和要点

目录 摘要 引言 正文 一、应用商店注册 二、准备APP材料 三、打包上传App 摘要 本文将介绍移动应用程序上架的基本流程和要点&#xff0c;包括应用商店注册、APP材料准备、打包上传App、APP审核以及发布APP的详细步骤。此外&#xff0c;还会提到利用appuploder工具简化i…

Spring Cloud 实战系列之 Zuul 微服务网关搭建及配置

一、创建SpringBoot项目 用mavan搭建也可以。&#xff08;重要的是后面pom里应该引入那些依赖&#xff0c;application.yml怎么配置&#xff09; 由于开始构建项目时选择了Eureka Server&#xff0c;所以pom.xml中不需要手动添加依赖了 首先在启动类SpringcloudApplicatio…

SpringBoot项目连接Redis报错:Connection refused: no further information

今天在使用SpringBoot连接Redis时发生了报错 明明Jedis能够连接成功为什么StringRedisTemplate就不行? 然后在网上找了一下说是关闭防火墙或者修改配置文件但是都不管用 最后发现是Redis在SpringBoot3之后yml的配置方式发生了改变 相较于之前多了一个前缀, 由于我刚开始没有…