Vue2 —— 学习(九)

news2024/11/17 19:34:21

目录

一、全局事件总线

(一)全局总线介绍

关系图

 对图中的中间商 x 的要求

1.所有组件都能看到

2.有 $on $off $emit

(二)案例

发送方 student

接收方

二、消息订阅和发布

(一)介绍

(二)使用消息订阅

(三)案例 

发送方语法

接收方语法

三、todoList 编辑功能

(一)MyItem 文件内容

(二)App 文件内容 

(三)$nextTick(function(){}) 

四、过度与动画

(一)用css动画写

(二)用过渡写

(三)设置多个标签动画

(四)使用成型的动画库

(五)总结

五、解决 ajax 请求跨域的问题

(一)复习

(二)跨域问题描述 

(三)跨域解决办法

1.cors

2.jsonp

3.代理服务器

介绍

构建代理服务器

方式一  简单的代理服务器

方式二 高级代理

(四)github 搜索案例

1.发送按钮组件

2.列表组件

3.app 组件


一、全局事件总线

(一)全局总线介绍

这是程序员们的经验

可以实现任意组件间的通信

关系图

就是使用 自定义事件 的方式来实现通讯

在接收方的身上经过 x 绑定自定义事件  然后传数据的人经过 x 来触发这个事件并传递数据 回调函数在接收方那里 就能把发送方的数据发送过去

 对图中的中间商 x 的要求
1.所有组件都能看到

x 得放到 vue 的 原型对象上, 就是 Vue.prototype.x = {a:1,b:2}

我们起名不叫 x 叫 $bus 为了迎合 Vue 的语法规则自己起的名 只是一个傀儡

写在 main.js  入口函数里面

安装 全局总线

import Vue from 'vue'
import App from './App.vue'

Vue.config.productionTip = false

new Vue({
  el: '#app',
  render: h => h(App),
  beforeCreate() {
    Vue.prototype.$bus = this
  }
})
2.有 $on $off $emit

这三个属性都在 Vue 的原型对象上

(二)案例

发送方 student
   <button @click="sendStudentName">把学生名给school</button>

使用 emit 触发我们绑定的事件 然后后面传入我们 想传的数据 

 methods: {
    sendStudentName(){
      this.$bus.$emit('hello',666)
    }
  },
接收方

最好一挂载就绑定 所以写在生命周期钩子 mounted 里面

 mounted(){
    this.$bus.$on('hello',(data)=>{
      console.log('我是 school 组件',data)
    })
  }

最好在后面加上一句这个 

beforeDestroy(){
    this.$bus.$off('hello')
  }

二、消息订阅和发布

(一)介绍

消息订阅,就是绑定我们能接收消息的名字 以后有人发送该名字的消息 我们能调用我们内部的函数接收到

发布消息,就是发布的内容

(二)使用消息订阅

原生的 js 没有消息订阅的功能 ,所以我们要下载第三方的库

我们使用 pubsub.js 库进行 sub 是 subscribe 订阅的意思 pub 就是 publish 发布的意思

先下载库 然后在 发送消息 接收消息的组件中 都要引入这个库 语法如下 

import pubsub from 'pubsub-js'

(三)案例 

发送方语法

点击按钮发送 hello 消息 内容是 666

   <button @click="sendStudentName">把学生名给school</button>
methods: {
    sendStudentName(){
      // this.x.$emit('hello',666)
      pubsub.publish('hello',666)
    }
  },
接收方语法

接收名字为 hello 的消息 并且执行回调函数

回调函数内部有两个参数 第一个是消息名 第二个是数据

最好写成箭头函数否则 this 的指向会出问题

mounted(){
    this.pid = pubsub.subscribe('hello',(message,data)=>{
      console.log('有人发布了hello 消息 回调执行了',message,data)
    })
  },

最后加上一句这个  

beforeDestroy(){
    // this.$bus.$off('hello')
    pubsub.unsubscribe('this.pubid')
  }

三、todoList 编辑功能

(一)MyItem 文件内容

在 Item 中 先写一个文本框 然后和前面的 span 用 v-show 方式 用里面的 todo.isEdit 数据来决定显示哪一个数据

      <span v-show="!todo.isEdit"> {{ todo.title }}</span>
 <input
        v-show="todo.isEdit"
        type="text"
        :value="todo.title"
        @blur="handleBlur(todo,$event)"
        ref="inputTitle"
      />

用一个按钮 来触发编辑,里面调用 我们编辑的方法 handleEdit 并把 todo 传进去

<button v-show="!todo.isEdit" class="btn btn-edit" @click="handleEdit(todo)">编辑</button>

handleEdit 函数内容 我们要添加 isEdit 属性 先判断一下原先存不存在这个 属性 如果存在直接修改这个属性值即可,如果没有我们再添加

用 $set 方法添加 

 handleEdit(todo) {
      if (todo.hasOwnProperty("isEdit")) {
        todo.isEdit = true;
      } else {
        this.$set(todo, "isEdit", true);
      }
    },

当光标失去焦点时我们改变数据,通过全局总线 传数据 

handleBlur(todo,e) {
      todo.isEdit = false;
      if(!e.target.value.trim()) return alert('输入不能为空')
      this.$bus.$emit('updateTodo',todo.id,e.target.value)
    },

(二)App 文件内容 

 在 app 中绑定事件 然后 写回调函数

this.$bus.$on("updateTodo", this.updateTodo);

 回调函数修改 显示的数据

updateTodo(id, title) {
      this.todos.forEach((todo) => {
        if (todo.id === id) todo.title = title;
      });
    },

我们想点击编辑时就获得焦点 修改一下handle 函数

handleEdit(todo) {
      if (todo.hasOwnProperty("isEdit")) {
        todo.isEdit = true;
      } else {
        this.$set(todo, "isEdit", true);
      }
      setTimeout(() => {
        this.$refs.inputTitle.focus();
      },200);
    },

(三)$nextTick(function(){}) 

但是开发中更常用 $nextTick(function(){}) 下一次更新 dom 模板之后才执行

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

这样更改数据 模板重新解析 dom 元素,解析完毕调用函数 获得焦点

handleEdit(todo) {
      if (todo.hasOwnProperty("isEdit")) {
        todo.isEdit = true;
      } else {
        this.$set(todo, "isEdit", true);
      }
      // setTimeout(() => {
      //   this.$refs.inputTitle.focus();
      // },200);
      this.$nextTick(function(){
        this.$refs.inputTitle.focus();
      })
    },

四、过度与动画

transition 标签只能设置一个元素的动画 里面不能放两个标签 如果想给多个元素设置动画,就用transition-group

(一)用css动画写

先在 css 中写一个动画效果 进来和出来两个效果,分别写在 come 和 go 里面 

.come {
  animation: hahaha 1s;
}
.go {
  animation: hahaha 1s reverse;
}
@keyframes hahaha {
  from {
    transform: translateX(-100%);
  }
  to {
    trnasform: translateX(0px);
  }
}

然后 标签中调用动画效果

    <h1 v-show="isShow" class="go">你好啊!</h1>

我们可以通过 vue 来切换我们要使用的动画 不用自己写判断  什么时候调用什么动画

这一种过渡的效果 我们就能通过 transition(过渡) 标签来设置

在合适的时候加上 特定的类名就是特定的动画 come 就是来 go 就是去

 <transition name="hello" :appear="true">
      <h1 v-show="isShow">你好啊!</h1>
    </transition>

transition 还能命名 但是css 中的效果对应也得修改 后面的 appear 属性 能让动画一开始就出来

前面的名字得改成一样的

.hello-enter-active {
  animation: hahaha 1s;
}
.hello-leave-active {
  animation: hahaha 1s reverse;
}

(二)用过渡写

.hello-enter 是进入的起点

hello-enter-to 是进入的终点

hello-leave 是退出的起点

hello-leave-to 是退出的终点

hello-enter-active 是进入过渡的效果

hello-leave- active 是离开的过渡效果

模板的内容和前面一样

<button @click="isShow = !isShow">显示隐藏</button>
    <transition name="hello" :appear="true">
      <h1  v-show="isShow"> 你好啊!</h1>
    </transition>

进入的起点

.hello-enter{
    transform: translateX(-100%);
}

进入的终点 

.hello-leave-to{
    transform: translateX(0);
}

离开的起点 离开的终点

.hello-leave{
  transform: translateX(0);
}
.hello-leave-to{
    transform: translateX(-100%);
}

因为离开的起点和离开的终点和前面开始一致 我们直接合在一块儿写,效果是一样的 并且能简化代码的结构

.hello-enter, .hello-leave-to{
  transform: translateX(-100%);
}
.hello-enter-to, .hello-leave{
    transform: translateX(0);
}

过渡的效果 可以单独写在

.hello-enter-active,
.hello-leave-active {
  transition: 0.5s;
}

(三)设置多个标签动画

transition-group

用到 transition-group 时 里面的标签需要给 key 值

<template>
  <div>
    <button @click="isShow = !isShow">显示隐藏</button>
    <transition-group name="hello" :appear="true">
      <h1 v-show="isShow" key="1">你好啊!</h1>
      <h1 v-show="isShow" key="2">你好啊!</h1>
    </transition-group>
  </div>
</template>

(四)使用成型的动画库

先用 npm 安装这个包 Animate.css

然后引入 import

import 'animate.css'

然后把网站中写好的类名 放到 name 中

然后再多加一个属性

enter-active-class=“” 进入的动画

leave-active-class=“" 退出的动画 

后面引号的内容直接去网站引入就行

 <transition-group
      name="animate__animated animate__bounce"
      :appear="true"
      enter-active-class="animate__swing"
      leave-active-class="animate__backOutRight"
    >

(五)总结

当我们操纵 dom 元素时 在合适的时候 给元素添加样式类名

进入退出 都有三个状态

进入的起点 v-enter

进入的终点 v-enter-to

进入的总过程 v-enter-active

写法

如果用动画写直接用  v-enter-active  v-leave-active

如果不用的话 就得用  v-enter v-enter-to v-leave v-leave-to

transition 包含要过渡的元素,得配置 name 属性

多个元素时 得用 <transition-group> 并且里面的每一个元素都得有 key 值

五、解决 ajax 请求跨域的问题

vue-cli 开启 8080 服务器 支持脚手架的运行

(一)复习

复习 : 常用的发送 ajax 请求的方式有什么

1.xhr new (鼻祖 太老了 不用他)

XMLHttpRequest()

xhr.open() 配置请求信息

xhr.send() 真正发出去的请求

2.jQuery 

因为 xhr 太古老了 我们需要有人封装一下里面的方法 可以是公司的内部人员

也有现成的封装 就是 jQuery 封装过 xhr

$.get $post

3.axios

也是对 xhr 的封装

4.fetch

和 xhr 是平级的 都是在window 的内置对象上能直接使用

兼容性较差,ie 完全用不了 

所以建议使用 axios

(二)跨域问题描述 

先引入 axios

import axios from ‘axios’

然后写一个向服务器发送发送 ajax 请求的代码

<template>
  <div>
   <button  @click="getStudents">获得学生信息</button>
  </div>
</template>
<script>
import axios from 'axios'
export default {
  name: "app",
 methods:{
  getStudents(){
    axios.get('http://localhost:5000/students').then(
      response => {
        console.log('请求成功了',response.data)
      },
      error => {
        console.log('请求失败',error.message)
      }
    )
  }
 }
};
</script>

首先先开启我们的资源服务器 端口为 5000

然后启动 vue 脚手架,点击按钮发送 ajax 请求

发现报错 

发现关键词 cors 还有那个一长串的属性 这是我们之前学的 ajax 同源策略 的知识,现在我们的网站是 8080 端口而且是 http 协议 主机名是 localhost 

但是资源服务器 也是 http 协议 主机名也是 localhost 但是 端口号是 5000 和8080 不同不符合同源策略,所以报错 必须三个都相同才是 同源

浏览器成功发送请求了

资源服务器也接收服务器的请求了

我们服务器也接收到返回的资源了

但是我们的网站 发现端口号不太对 就不把资源给我们了,但是我们浏览器里面现在手里有资源

(三)跨域解决办法

1.cors

就是写服务器的人在 响应的时候加几个特殊的响应头

我们的网站成功发送请求了

资源服务器也接收请求了

我们网站也接收到返回的资源了 并且这个资源携带着特殊的响应头 我们网站一接收 发现这个响应头就明白我们要这个数据 就把数据给我们了 实现了跨域

特点:能解决跨域但是 容易任何人都能访问我们的资源服务器 获得资源不太好

需要后端写服务器的人员帮忙

2.jsonp

借助了script 标签里面的 src 属性 引入外部资源的时候不受同源策略的限制

使用的非常少 只能解决 get 请求的 跨域问题

需要前后端一块儿帮忙

3.代理服务器
介绍

代理服务器和我们网站所处在的位置相同

我们想向 资源服务器请求资源 我们先向代理服务器 发送请求

代理服务器再把请求转发给资源服务器

资源服务器把资源返回给代理服务器

代理服务器再把资源转发给我们 我们就收到数据了

粉色的是服务器 蓝色的也是服务器 服务器服务器之间 不用发送 ajax 就用原生的 http 协议即可

构建代理服务器

 1.使用 nignx 

后端了解一些再开启

2.使用 Vue 脚手架开启

方式一  简单的代理服务器

在vue.config.js 文件中编写代码

先在 vue-cli 的文档中 的配置项中 找到 devSever.proxy 后面的单词就是代理的意思

先把第一段代码沾到我们的文件的后面 开启代理服务器

端口号是我们要请求的服务器的端口号 不是8080 是 5000 后面不要写别的路径了

 devServer: {
    proxy: 'http://localhost:5000'
  }

然后 给我们 代码中的请求对象的端口也改成  8080 因为我们这回请求对象是代理服务器

<template>
  <div>
   <button  @click="getStudents">获得学生信息</button>
  </div>
</template>
<script>
import axios from 'axios'
export default {
  name: "app",
 methods:{
  getStudents(){
    axios.get('http://localhost:8080/students').then(
      response => {
        console.log('请求成功了',response.data)
      },
      error => {
        console.log('请求失败',error.message)
      }
    )
  }
 }
};
</script>

最后请求成功了

小问题:

8080 的根路径 在 public 文件夹中  里面的东西 跨=可以通过 localhost:8080/文件名的形式访问

如果 public 中 的文件出现了我们要请求的服务器中的文件名 我们就不会发送ajax 请求了而是直接把本地的东西拿来使用

比如上面的 students 如果我们本来就有就不发送请求了

而且 我们创建的代理服务器只能向一个资源服务器发送请求 不能向多个服务器发送请求

方式二 高级代理

里面有两段代码 第一段是完整代码 第二段是精简后的代码 我们先看前面的

就是我们的请求带着 这个信息我们就向代理发送请求 

/api 是请求前缀 代理服务器问我们 的 8080 我们本次请求的请求前缀是什么 如果是 /api 就走代理

target 就是我们要请求的目标  就是我们 url 地址  代理服务器把请求转发给这个地址

ws 是允许 websocket 通信

changeOrigin: true 是资源服务器 查看我们代理服务器位置时 代理服务器做出的应答,为真时 代理服务器就说我在 5000 其实在 8080 端口 ,如果时 false 就实话实说

 devServer: {
    proxy: {
      '/api': {
        target: '<url>',
        ws: true,
        changeOrigin: true
      },
      '/foo': {
        target: '<other_url>'
      }
    }
  }

初始化之后代码

devServer: {
    proxy: {
      '/daili': {
        target: 'http://localhost:5000',
        ws: true,
        changeOrigin: true
      },
  }
}

所以我们要使用这个代理服务器 我们得让我们原本的 请求地址带上请求前缀的信息,位置写在端口号的后面 后面的内容不用变化 还是 students

<template>
  <div>
   <button  @click="getStudents">获得学生信息</button>
  </div>
</template>
<script>
import axios from 'axios'
export default {
  name: "app",
 methods:{
  getStudents(){
    axios.get('http://localhost:8080/daili/students').then(
      response => {
        console.log('请求成功了',response.data)
      },
      error => {
        console.log('请求失败',error.message)
      }
    )
  }
 }
};
</script>

然后打开网页发送请求 出现 404 的错误 是因为我们的请求信息里面包含 /daili 我们代理服务器将请求转发时 把这个头前缀也转发了,但是资源服务器中没有 /daili 的路径,所以找不到信息报错

所以我们得把转发给资源服务器中的请求中的 /daili 去掉

我们得再加一个属性  pathRewrite:{'/^daili':' '} 匹配有 /daili 前缀的信息然后将这个信息 前缀转成空字符串 

 devServer: {
    proxy: {
      '/daili': {
        target: 'http://localhost:5000',
        pathRewrite:{'^/daili':''},
        ws: true,
        changeOrigin: true
      },
    }
  }

如果想向多个资源服务器发送请求 就复制一份 然后接着在 proxy 对象中写就行

 devServer: {
    proxy: {
      '/daili': {
        target: 'http://localhost:5000',
        pathRewrite:{'^/daili':''},
        ws: true,
        changeOrigin: true
      },
      '/demo': {
        target: 'http://localhost:5001',
        pathRewrite:{'^/demo':''},
        ws: true,
        changeOrigin: true
      },
    }
  }

注意:

由于我们这种写代理的方式 要加一个前缀,所以如果我们本地也有同名文件时 就强制去使用代理服务器 而不是直接使用我们本地的

我们还能通过这种方式实现 同时向多个服务器发送请求‘(能配置多个代理)

很好的解决了第一种方式的问题 

如果不想走代理不加前缀即可

(四)github 搜索案例

案例的网站已经解决了跨域的问题 用 cors

返回的数据 incomplete_results;false 说明发送的是不是完整的数据

item 是选出来的数据

第一个属性是 用户的头像 然后是每个人的 githbu 主页 地址

login 是用户的登录名

list 有四种展示 首先是刚进来的欢迎搜索

然后是 搜索时的加载中

然后是 搜索成功后的 用户信息

最后是 搜索请求出错时 的报错

代码结构

1.发送按钮组件
<template>
  <section class="jumbotron">
    <h3 class="jumbotron-heading">Search Github Users</h3>
    <div>
      <input
        type="text"
        placeholder="enter the name you search"
        v-model="keyWord"
      />&nbsp;
      <button @click="searchUsers">Search</button>
    </div>
  </section>
</template>

<script>
import axios from "axios";
export default {
  name: "Search",
  data() {
    return {
      keyWord: "",
    };
  },
  methods: {
    searchUsers() {
      this.$bus.$emit("updataListData", {
        isFirst: false,
        isLoading: true,
        errMsg: "",
        users: [],
      });
      axios.get(`https://api.github.com/search/users?q=${this.keyWord}`).then(
        (response) => {
          console.log("请求成功了", response.data.items);
          this.$bus.$emit("getUsers", response.data.items);
          this.$bus.$emit("updataListData", {
            isLoading: false,
            errMsg: "",
            users: response.data.items,
          });
        },
        (error) => {
          console.log("请求失败了", error.message);
          this.$bus.$emit("updataListData", {
            isLoading: false,
            errMsg: error.message,
            users: [],
          });
        }
      );
    },
  },
};
</script>
2.列表组件
<template>
  <div class="row">
    <div
      v-show="info.users.length"
      class="card"
      v-for="user in info.users"
      :key="user.login"
    >
      <a :href="user.html_url" target="_blank">
        <img :src="user.avatar_url" style="width: 100px" />
      </a>
      <p class="card-text">{{ user.login }}</p>
    </div>
    <h1 v-show="info.isFirst">欢迎使用!</h1>
    <h1 v-show="info.isLoading">加载中。。。。</h1>
    <h1 v-show="info.errMsg">{{info.errMsg}}</h1>
  </div>
</template>

<script scoped>
export default {
  name: "List",
  data() {
    return {
      info: {
        isFirst: true,
        isLoading: false,
        errMsg: "",
        users: [],
      },
    };
  },
  mounted() {
    this.$bus.$on("updataListData", (dataObj) => {
      this.info = {...this.info,...dataObj}
    });
  },
};
</script>

<style>
.album {
  min-height: 50rem; /* Can be removed; just added for demo purposes */
  padding-top: 3rem;
  padding-bottom: 3rem;
  background-color: #f7f7f7;
}

.card {
  float: left;
  width: 33.333%;
  padding: 0.75rem;
  margin-bottom: 2rem;
  border: 1px solid #efefef;
  text-align: center;
}

.card > img {
  margin-bottom: 0.75rem;
  border-radius: 100px;
}

.card-text {
  font-size: 85%;
}
</style>
3.app 组件
<template>
  <div class="container">
    <Search />
    <List />
  </div>
</template>
<script>
import Search from "./components/Search";
import List from "./components/List";

export default {
  name: "app",
  components: { Search, List },
};
</script>

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

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

相关文章

4.6 CORS 支持跨域

CORS (Cross-Origin Resource Sharing &#xff09;是由 W3C 制定的一种跨域资源共享技术标准&#xff0c;其目的就是为了解决前端的跨域请求。在 Java EE 开发中&#xff0c;最常见的前端跨域请求解决方案是 JSONP &#xff0c;但JSONP 只支持 GET 请求&#xff0c;这是 个很大…

数据结构之排序了如指掌(三)

目录 题外话 正题 快速排序 Hoare法 Hoare法思路 Hoare法代码详解 挖坑法 挖坑法思路 挖坑法代码 前后指针法 前后指针法思路 前后指针法代码 小结 题外话 我们接着把没有写完的排序内容完成,快速排序其实大同小异,大家好好把思路整理一下 正题 快速排序 快速排序一…

HarmonyOS 状态管理

在声明式 UI 框架中&#xff0c;数据的改变触发 UI 的重新渲染。在 ArkUI 中不是所有数据的变化都会触发 UI 重新渲染&#xff0c;只有 状态变量 才会引起 UI 重新渲染。 状态变量 状态变量&#xff1a; 指被状态装饰器装饰的变量&#xff0c;只有这种变量的改变才会引起 UI …

(2022级)成都工业学院数据库原理及应用实验七: 数据库安全

写在前面 1、基于2022级软件工程/计算机科学与技术实验指导书 2、成品仅提供参考 3、如果成品不满足你的要求&#xff0c;请寻求其他的途径 运行环境 window11家庭版 Navicat Premium 16 Mysql 8.0.36 实验要求 1、创建数据库hospital,在hospital数据库中创建科室表De…

第一个STM32F767IGT6核心板

一. 制作原因 起先是因为参加计算机设计大赛准备的板子&#xff0c;其作用是连接OV5640摄像头来识别车牌号&#xff0c;主要外设有摄像头&#xff0c;SDRAM&#xff0c;网口等。 二. 原理图和PCB 原理图 PCB 三. 测试 1. 测试SDRAM功能 按下按键我们可以在串口中看到内存…

LTspice/Simplis仿真代码使用

LTspice/Simplis仿真代码使用 HI uu们 HI uu们,关注我的uu经常看到我上面贴了很多仿真代码,但是不知道怎么用. 今天来介绍下仿真代码怎么用, 比如说,我们用OP07做了一个跟随器,如图1所示. 图1:OP07跟随器 他的仿真代码非常简单,如下所示 XU1 N002 vout N001 N003 vout LT…

【Linux】详解进程通信中信号量的本质同步和互斥的概念临界资源和临界区的概念

一、同步和互斥的概念 1.1、同步 访问资源在安全的前提下&#xff0c;具有一定的顺序性&#xff0c;就叫做同步。在多道程序系统中&#xff0c;由于资源有限&#xff0c;进程或线程之间可能产生冲突。同步机制就是为了解决这些冲突&#xff0c;保证进程或线程之间能够按照既定…

都以为他是自杀20年后遗书曝光才明白张国荣的离世不简单

在时光的长河中&#xff0c;有些瞬间如同流星划过天际&#xff0c;短暂却又璀璨夺目。二十年前的那个春天&#xff0c;一个灵魂从这个喧嚣世界悄然离去&#xff0c;留下无尽的叹息与疑问。他就是张国荣——一位被誉为“风华绝代”的巨星。许多人曾认定他的离开是一场悲剧性的自…

计算机网络 -- 多人聊天室

一 程序介绍和核心功能 这是基于 UDP 协议实现的一个网络程序&#xff0c;主要功能是 构建一个多人聊天室&#xff0c;当某个用户发送消息时&#xff0c;其他用户可以立即收到&#xff0c;形成一个群聊。 这个程序由一台服务器和n个客户端组成&#xff0c;服务器扮演了一个接受…

element-ui合计逻辑踩坑

element-ui合计逻辑踩坑 1.快速实现一个合计 ​ Element UI所提供的el-table中提供了方便快捷的合计逻辑实现&#xff1a; ​ https://element.eleme.cn/#/zh-CN/component/table ​ 此实现方法在官方文档中介绍详细&#xff0c;此处不多赘述。 ​ 这里需要注意&#xff0c…

Don‘t fly solo! 量化之路,AI伴飞

在投资界&#xff0c;巴菲特与查理.芒格的神仙友谊&#xff0c;是他们财富神话之外的另一段传奇。巴菲特曾这样评价芒格&#xff1a;他用思想的力量拓展了我的视野&#xff0c;让我以火箭的速度&#xff0c;从猩猩进化到人类。 人生何幸能得到一知己。如果没有这样的机缘&…

每日学习笔记:C++ STL算法之容器元素变序

目录 反转元素次序 reverse(beg, end) reverse_copy(srcBeg, srcEnd, destEnd) 旋转元素 旋转&#xff1a;rotate(beg, newBeg, end) 复制同时旋转&#xff1a;rotate_copy(srcBeg, srcNewBeg, srcEnd, destBeg) 对元素做排列组合情况列举与切换 next_permutation(beg, …

国产化里程碑:明道云HAP私有部署版获信创评估证书,荣登会员单位

近期&#xff0c;明道云HAP私有部署版荣获信创产品评估证书&#xff0c;这一成就不仅标志着我们在信创领域的深入布局和持续努力获得了行业的广泛认可&#xff0c;也是对我们积极拥抱和推动国产化技术发展的肯定。更值得一提的是&#xff0c;我们还被授予“成员单位”的称号&am…

基于通达信---做T专用算法

什么是做T? 股票做T是股票市场中常见的一种投资策略,也就是股票进行T+0操作,通过当天买进的股票,在当天卖出,是股市中常见的一种超短线的操作。其中T就是指交易日,利用交易日中的股票涨跌来赚取差价。股票做T常见的类型就是正T和倒T。 1、正T 股票做正t就是指先买后卖,…

Rokid AR Lite空间计算套装发布,中国空间计算踏上差异化领先之路

动动手指、动动眼睛就可以“操控一切”&#xff0c;这种颇具科幻感、未来感的交互方式&#xff0c;令许多人感叹“未来已来”。而这令人震撼的变革背后&#xff0c;正是空间计算技术的迅猛崛起与广泛应用&#xff0c;使得这种曾经只存在于想象中的交互方式&#xff0c;如今正逐…

快速访问github

修改本地hosts文件 GitHub访问慢的原因在于域名解析&#xff0c;通过修改本地的hosts文件&#xff0c;将远程DNS解析改为本地DNS解析。 fang 步骤1&#xff1a;打开hosts文件&#xff08;没有就创建&#xff09; host所在位置&#xff1a; C:\Windows\System32\drivers\etc…

linux jenkins 2.89.1 安装部署 持续构建svn下maven项目并部署到tomcat

从这边博文可以学习到&#xff1a; jenkins的安装修改主目录初始化新建任务&#xff0c;构建第一个maven项目将构建完成的项目部署到tomcat Jenkins的安装相当简单&#xff0c;只需要从官网下载war包&#xff0c;放入tomcat&#xff0c;运行tomcat就可以访问Jenkins了 准备工作…

PyCharm,终端conda环境无法切换的问题(二个解决方案)

问题 PyCharm终端&#xff0c;环境切换无效&#xff0c;默认始终为base 解决一 Settings->Tools->Terminal->ShellPath&#xff0c;将powershell修改为cmd.exe 解决二 conda config --show在输出中找到 auto_activate_base 的行&#xff0c;发现被设置为 true&#x…

数据结构-双链表(图解)

目录 双链表&#xff08;Double-Linked List&#xff09;的概念与基本特性 一、双链表的基本组成 二、双链表的主要特性 三、双链表的操作 代码展示 malloc开辟函数 解析 初始化 解析 头插 解析 尾插 解析 头删 解析 尾删 解析 pos之后插入 解析 pos删除 …

抖音小店无货源怎么做?教你新店快速起店新攻略,你还在等什么?

大家好&#xff0c;我是电商花花。 从我关注抖音小店这个风口到现在已经有很长时间了&#xff0c;从了解到实操到复盘&#xff0c;陆陆续续将多家单店店铺月营业额达到数百万。 目前团队运营着80多家店铺&#xff0c;人均管理3-5个店铺&#xff0c;大部分店铺月营业额都在5W-…