Vue基础14之TodoList组件自定义事件、全局事件总线、TodoList全局事件总线

news2025/2/26 0:37:26

Vue基础14

  • TodoList-组件自定义事件
    • 先改Header和Footer子组件,List先不考虑
      • App.vue
      • MyHeader.vue
      • MyFooter.vue
  • 全局事件总线
    • 实现思路
    • 正规写法
      • main.js
      • App.vue
      • Student.vue
      • School.vue
    • 总结:全局事件总线(GlobalEventBus)
  • TodoList案例:全局事件总线
    • App.vue
    • MyItem.vue
    • MyList.vue

TodoList-组件自定义事件

先改Header和Footer子组件,List先不考虑

App.vue

<MyHeader  @addTodo="addTodo"/>
<MyFooter :todos="todos" @clearAllTodo="clearAllTodo" @checkAllTodo="checkAllTodo"/>

Header.vue

add(){
      if(!this.title.trim()) return alert('输入的值不能为空!');
      const todoObj={
        id:nanoid(),
        title:this.title,
        done:false
      };
      this.$emit("addTodo",todoObj)
      this.title=''
    }

Footer.vue

props:['todos'],
isAll:{
      get(){
        return this.haveDone===this.total&&this.total>0
      },
      set(value){
        // this.todos.forEach(todo=>todo.done=value)
        // this.checkAllTodo(value)
        this.$emit("checkAllTodo",value)
      }
    }
methods:{
    checkAll(e){
      // this.checkAllTodo(e.target.checked)
      this.$emit("checkAllTodo",e.target.checked)
    },
    clearAll(){
      if(confirm('确定删除已完成任务吗?')){
        // this.clearAllTodo()
        this.$emit("clearAllTodo")
      }
    }
  }

App.vue

<template>
  <div class="bg">
    <div class="todoList">
      <h2 class="title">待办事项</h2>
      <MyHeader  @addTodo="addTodo"/>
      <div class="listItem" v-show="todos.length">
        <MyList :todos="todos" :deleteTodo="deleteTodo" :checkTodo="checkTodo"/>
        <MyFooter :todos="todos" @clearAllTodo="clearAllTodo" @checkAllTodo="checkAllTodo"/>
      </div>
    </div>
  </div>
</template>

<script>
import MyHeader from "@/components/MyHeader";
import MyList from '@/components/MyList';
import MyFooter from '@/components/MyFooter'
export default {
  name: "App",
  components:{MyHeader, MyList, MyFooter},
  data(){
    return{
      todos:JSON.parse(localStorage.getItem('todos'))||[]
    }
  },
  methods:{
    //添加一个todo
    addTodo(todoObj){
      this.todos.unshift(todoObj)
    },
    //删除一个todo
    deleteTodo(id){
      this.todos=this.todos.filter(todo=>todo.id!==id)
    },
    //勾选or取消勾选一个todo
    checkTodo(id){
      this.todos.forEach((todo)=>{
        if(todo.id===id){
          todo.done=!todo.done
        }
      })
    },
    //清除已完成任务
    clearAllTodo() {
      this.todos=this.todos.filter(todo=>!todo.done)
    },
    //全选or取消全选
    checkAllTodo(done){
      this.todos.forEach(todo=>todo.done=done)
    }
  },
  watch:{
    todos:{
      //开启深度监视
      deep:true,
      handler(value){
        localStorage.setItem('todos',JSON.stringify(value))
      }
    }
  }
}
</script>

<style lang="less">
*{
  padding: 0;
  margin: 0;
}
.bg{
  background-color: #333;
  height: 937px;
  padding-top: 100px;
  box-sizing: border-box;
  .todoList{
    background-color: #fff;
    width: 50%;
    height: 90%;
    margin: 0 auto;
    //box-shadow: 5px 5px 10px 3px rgba(147, 221, 255, 0.5),-5px -5px 10px 3px rgba(147, 221, 255, 0.5);  蓝色阴影
    box-shadow: 5px 5px 10px 3px rgba(0, 0, 0, 0.5),-5px -5px 10px 3px rgba(0, 0, 0, 0.5);
    padding-top: 20px;
    box-sizing: border-box;
    .title{
      text-align: center;
      font-size: 30px;
      font-weight: 300;
      color: #00a4ff;
    }
    .listItem{
      width: 90%;
      //height: 200px;
      margin: auto;
      /*background-color: pink;*/
      list-style: none;
      border-radius: 0 0 5px 5px;
      box-shadow: 1px 1px 5px 1px rgba(0,0,0,0.1),-1px -1px 5px 1px rgba(0,0,0,0.1);
      padding: 20px 0;
      box-sizing: border-box;
    }
  }
}
</style>

MyHeader.vue

<template>
  <div>
    <input type="text" class="content" @keyup.enter="add" placeholder="请输入你的任务名称,按回车键确认" v-model="title">
  </div>
</template>

<script>
import {nanoid} from 'nanoid';
export default {
  name: "MyHeader",
  data(){
    return{
      title:''
    }
  },
  methods:{
    add(){
      if(!this.title.trim()) return alert('输入的值不能为空!');
      const todoObj={
        id:nanoid(),
        title:this.title,
        done:false
      };
      this.$emit("addTodo",todoObj)
      this.title=''
    }

  }
}
</script>

<style scoped lang="less">
div{
  width: 90%;
  height: 8%;
  background-color: #ffffff;
  box-shadow: 1px 1px 5px 1px rgba(0,0,0,0.1),-1px -1px 5px 1px rgba(0,0,0,0.1);
  margin: 10px auto 2px auto;
  display: flex;
  .content{
    width: 95%;
    height: 80%;
    font-size: 25px;
    outline: none;
    display: block;
    margin: auto;
    justify-content: center;
    align-self: center;
    border: none;
  }
}
</style>

MyFooter.vue

<template>
  <div>
<!--    <input type="checkbox" name="matter" id="" :checked="isAll" @change="checkAll">-->
    <input type="checkbox" name="matter" id="" v-model="isAll">
    &nbsp;已完成 <span>{{haveDone}}</span> / 全部 <span>{{total}}</span>
    <button @click="clearAll">清除已完成任务</button>
  </div>
</template>

<script>
export default {
  name: "MyFooter",
  props:['todos'],
  computed:{
    total(){
      return this.todos.length
    },
    haveDone(){
      return this.todos.reduce((pre,current)=>{
        return pre+(current.done?1:0)
      },0)
    },
    // isAll(){
    //   return this.haveDone===this.total&&this.total>0
    // },
    isAll:{
      get(){
        return this.haveDone===this.total&&this.total>0
      },
      set(value){
        // this.todos.forEach(todo=>todo.done=value)
        // this.checkAllTodo(value)
        this.$emit("checkAllTodo",value)
      }
    }
  },
  methods:{
    checkAll(e){
      // this.checkAllTodo(e.target.checked)
      this.$emit("checkAllTodo",e.target.checked)
    },
    clearAll(){
      if(confirm('确定删除已完成任务吗?')){
        // this.clearAllTodo()
        this.$emit("clearAllTodo")
      }
    }
  }

}
</script>

<style scoped lang="less">
div{
  width: 95%;
  margin: auto;
  margin-top: 10px;
  //border: 1px solid rgba(87, 87, 87, 0.3);
  button{
    background-color: #d9534f;
    float: right;
    padding: 3px 10px;
    color: white;
    border: 1px solid #d43f3a;
    border-radius: 5px;
    cursor: pointer;
    &:hover{
      background-color: #c9302c;
      border: 1px solid #ac2925;
    }
  }
}
</style>

Chrome浏览器安装Vue legacy插件才能显示自定义事件

请添加图片描述

全局事件总线

使用一个中间者x组件作为桥梁,实现任意组件之间能够通信
在这里插入图片描述

实现思路

  1. 第一步:所有人都能有回调函数
    知识点回顾:
    参考:Vue基础8的非单文件组件的一个重要的内置关系:VueComponent的原型对象是继承Vue的原型对象的
    在这里插入图片描述
    应用在项目中:
    在main.js里:
//1.生成一个VueComponent构造函数
const Demo=Vue.extend({})
//2.new一个VC对象
const d=new Demo()
//3.在原型中放置这个x为刚创建的VC
Vue.prototype.x=d

main.js

import Vue from 'vue';

import App from './App'

Vue.config.productionTip=false

//1.生成一个VueComponent构造函数
const Demo=Vue.extend({})
//2.new一个VC对象
const d=new Demo()
//3.在原型中放置这个x为刚创建的VC
Vue.prototype.x=d

new Vue({
    el:"#app",
    render:h=>h(App),
})

  1. 实现Student.vue与School.vue组件之间通信
    School.vue
<template>
  <div class="school">
    <h1>学校名称:{{name}}</h1>
    <h1>学校地址:{{address}}</h1>
    <h2 v-if="studentName">学生的姓名是:{{studentName}}</h2>
  </div>
</template>

<script>
export default {
    name: "School",
    data(){
      return{
        name:"幸福中学",
        address:"重庆市渝北区",
        studentName:""
      }
    },
    mounted(){
      this.x.$on("hello",(value)=>{
        this.studentName=value
      })
    }
}
</script>

<style scoped>
.school{
  background-color: skyblue;
}
</style>

Student.vue

<template>
  <div class="student">
    <h1>学生姓名:{{name}}</h1>
    <h1>学生性别:{{sex}}</h1>
    <button @click="showMsg">点我输出学生姓名</button>
  </div>
</template>

<script>
    export default {
        name: "Student",
        data(){
          return{
            name:'李四',
            sex:'女'
          }
        },
        methods:{
          showMsg(){
            this.x.$emit("hello",this.name)
          }
        }
    }
</script>

<style scoped>
.student{
  background-color: pink;
}
</style>

请添加图片描述

正规写法

Vue原型身上的$on,$off,$emit不仅VC能调用到,Vm也可以
但是以下写法会报错:

//创建vm
const vm=new Vue({
  el:"#app",
  render:h=>h(App)
})

Vue.prototype.x=vm

因为new Vue代码执行完毕后,意味着整个App组件(包括子组件School)都放到页面上去了,这时候再给原型x放vm已经晚了,这时可以借助生命周期函数使这一步有效。

正规写法如下:

main.js

import Vue from 'vue';

import App from './App'

Vue.config.productionTip=false


new Vue({
    el:"#app",
    render:h=>h(App),
    beforeCreate() {
        Vue.prototype.$bus=this
    }
})

App.vue

<template>
  <div class="main">
    <h1>{{msg}}</h1>
    <School />
    <Student />
  </div>
</template>

<script>
import School from "@/components/School";
import Student from "@/components/Student";
export default {
  name: "App",
  data() {
    return {
      msg: "你好啊!",
    }
  },
  components:{School,Student},
}
</script>

<style scoped>
.main{
  background-color: grey;
  padding: 5px;
}
</style>

Student.vue

<template>
  <div class="student">
    <h1>学生姓名:{{name}}</h1>
    <h1>学生性别:{{sex}}</h1>
    <button @click="showMsg">点我输出学生姓名</button>
  </div>
</template>

<script>
    export default {
        name: "Student",
        data(){
          return{
            name:'李四',
            sex:'女'
          }
        },
        methods:{
          showMsg(){
            // this.x.$emit("hello",this.name)
            this.$bus.$emit("hello",this.name)
          }
        }
    }
</script>

<style scoped>
.student{
  background-color: pink;
}
</style>

School.vue

<template>
  <div class="school">
    <h1>学校名称:{{name}}</h1>
    <h1>学校地址:{{address}}</h1>
    <h2 v-if="studentName">学生的姓名是:{{studentName}}</h2>
  </div>
</template>

<script>
export default {
    name: "School",
    data(){
      return{
        name:"幸福中学",
        address:"重庆市渝北区",
        studentName:""
      }
    },
    mounted(){
      // this.x.$on("hello",(value)=>{
      //   this.studentName=value
      // })
      this.$bus.$on("hello",(data)=>{
        this.studentName=data
      })
    },
    beforeDestroy(){
      this.$bus.off("hello")
    }
}
</script>

<style scoped>
.school{
  background-color: skyblue;
}
</style>

请添加图片描述

总结:全局事件总线(GlobalEventBus)

  1. 一种组件间通信的方式,适用于任意组件间通信
  2. 安装全局事件总线:

new Vue({

beforeCreate(){
Vue.prototype.$bus=this //安装全局事件总线,$bus就是当前应用的vm
},

})

  1. 使用事件总线:
    (1)接收数据:A组件想要接收数据,则在A组件中给$bus绑定自定义事件,事件的回调留在A组件自身

    methods(){
    demo(data){…}
    }

    mounted(){
    this.$bus.$on(‘xxx’,this.demo)
    }

(2)提供数据:

this.$bus.$emit(‘xxx’,数据)

  1. 最好在beforeDestroy钩子中,用$off去解绑当前组件所用到的事件

TodoList案例:全局事件总线

对于Item到App之间的传值,建议使用全局事件总线来传递,这样就不用List作为桥梁传递了

App.vue:

mounted(){
    //使用公共组件实现父组件和孙子组件传值
    this.$bus.$on("deleteTodo",this.deleteTodo)
    this.$bus.$on("checkTodo",this.checkTodo)
  },
  beforeDestroy() {
    //销毁公共组件的不再使用的组件
    this.$bus.$off("deleteTodo")
    this.$bus.$off("checkTodo")
  }

MyItem.vue:

export default {
  name: "MyItem",
  props:['todo'],
  methods:{
    deleteItem(id){
      //触发公共组件的某个事件
      if(confirm('确认删除嘛?'))  this.$bus.$emit("deleteTodo",id)
    },
    checkDone(id){
      //触发公共组件的某个事件
      this.$bus.$emit("checkTodo",id)
    }
  }
}

完整代码:

App.vue

<template>
  <div class="bg">
    <div class="todoList">
      <h2 class="title">待办事项</h2>
      <MyHeader  @addTodo="addTodo"/>
      <div class="listItem" v-show="todos.length">
        <MyList :todos="todos"/>
        <MyFooter :todos="todos" @clearAllTodo="clearAllTodo" @checkAllTodo="checkAllTodo"/>
      </div>
    </div>
  </div>
</template>

<script>
import MyHeader from "@/components/MyHeader";
import MyList from '@/components/MyList';
import MyFooter from '@/components/MyFooter'
export default {
  name: "App",
  components:{MyHeader, MyList, MyFooter},
  data(){
    return{
      todos:JSON.parse(localStorage.getItem('todos'))||[]
    }
  },
  methods:{
    //添加一个todo
    addTodo(todoObj){
      this.todos.unshift(todoObj)
    },
    //删除一个todo
    deleteTodo(id){
      this.todos=this.todos.filter(todo=>todo.id!==id)
    },
    //勾选or取消勾选一个todo
    checkTodo(id){
      this.todos.forEach((todo)=>{
        if(todo.id===id){
          todo.done=!todo.done
        }
      })
    },
    //清除已完成任务
    clearAllTodo() {
      this.todos=this.todos.filter(todo=>!todo.done)
    },
    //全选or取消全选
    checkAllTodo(done){
      this.todos.forEach(todo=>todo.done=done)
    }
  },
  watch:{
    todos:{
      //开启深度监视
      deep:true,
      handler(value){
        localStorage.setItem('todos',JSON.stringify(value))
      }
    }
  },
  mounted(){
    //使用公共组件实现父组件和孙子组件传值
    this.$bus.$on("deleteTodo",this.deleteTodo)
    this.$bus.$on("checkTodo",this.checkTodo)
  },
  beforeDestroy() {
    //销毁公共组件的不再使用的组件
    this.$bus.$off("deleteTodo")
    this.$bus.$off("checkTodo")
  }
}
</script>

<style lang="less">
*{
  padding: 0;
  margin: 0;
}
.bg{
  background-color: #333;
  height: 937px;
  padding-top: 100px;
  box-sizing: border-box;
  .todoList{
    background-color: #fff;
    width: 50%;
    height: 90%;
    margin: 0 auto;
    //box-shadow: 5px 5px 10px 3px rgba(147, 221, 255, 0.5),-5px -5px 10px 3px rgba(147, 221, 255, 0.5);  蓝色阴影
    box-shadow: 5px 5px 10px 3px rgba(0, 0, 0, 0.5),-5px -5px 10px 3px rgba(0, 0, 0, 0.5);
    padding-top: 20px;
    box-sizing: border-box;
    .title{
      text-align: center;
      font-size: 30px;
      font-weight: 300;
      color: #00a4ff;
    }
    .listItem{
      width: 90%;
      //height: 200px;
      margin: auto;
      /*background-color: pink;*/
      list-style: none;
      border-radius: 0 0 5px 5px;
      box-shadow: 1px 1px 5px 1px rgba(0,0,0,0.1),-1px -1px 5px 1px rgba(0,0,0,0.1);
      padding: 20px 0;
      box-sizing: border-box;
    }
  }
}
</style>

MyItem.vue

<template>
  <div>
    <li>
      <!--      <input type="checkbox" name="matter" id="" v-model="todo.done">-->
      <input type="checkbox" name="matter" id="" @change="checkDone(todo.id)" :checked="todo.done">
      &nbsp;{{todo.title}}
      <button class="delete" @click="deleteItem(todo.id)">删除</button>
    </li>
  </div>
</template>

<script>
export default {
  name: "MyItem",
  props:['todo'],
  methods:{
    deleteItem(id){
      //触发公共组件的某个事件
      if(confirm('确认删除嘛?'))  this.$bus.$emit("deleteTodo",id)
    },
    checkDone(id){
      //触发公共组件的某个事件
      this.$bus.$emit("checkTodo",id)
    }
  }
}
</script>

<style scoped lang="less">
li{
  //height: 35%;
  //width: 96%;
  display: block;
  //background-color: pink;
  margin: auto;
  padding: 12px;
  border-top: 1px solid rgba(87, 87, 87, 0.3);
  //border-left: 1px solid rgba(87, 87, 87, 0.3);
  //border-right: 1px solid rgba(87, 87, 87, 0.3);
  //box-sizing: border-box;
  border-collapse: collapse;
  button{
    background-color: #d9534f;
    float: right;
    padding: 3px 10px;
    color: white;
    border: 1px solid #d43f3a;
    border-radius: 5px;
    cursor: pointer;
    &:hover{
      background-color: #c9302c;
      border: 1px solid #ac2925;
    }
  }
  &:hover{
    background-color: rgba(0,0,0,0.1);
  }
}
</style>

MyList.vue

<template>
  <div>
    <ul>
      <div class="con">
        <MyItem v-for="todo in todos" :todo="todo" :key="todo.id"/>
      </div>
    </ul>
  </div>
</template>

<script>
import MyItem from "@/components/MyItem";
export default {
  name:'MyList',
  components:{MyItem},
  props:['todos']
}
</script>

<style scoped lang="less">
ul{
  .con{
    //width: 95%;
    //margin: auto;
    border-bottom: 1px solid rgba(87, 87, 87, 0.3);
    border-left: 1px solid rgba(87, 87, 87, 0.3);
    border-right: 1px solid rgba(87, 87, 87, 0.3);
    margin: 0px 8px;
    //background-color: pink;
  }
}
</style>


请添加图片描述

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

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

相关文章

【Java闭关修炼】MyBatis-接口代理的方式实现Dao层

【Java闭关修炼】MyBatis-接口代理的方式实现Dao层实现规则代码实现代理对象分析接口代理方式小结实现规则 映射配置文件中的名称空间必须和Dao层接口的全类名相同映射配置文件的增删改查标签的id属性必须和Dao层接口方法的参数相同映射配置文件中的增删改查标签的parameterTyp…

【C进阶】数据的存储

文章目录:star:1. 数据类型:star:2. 整形在内存中的存储2.1 存储规则2.2 存储模式2.3 验证大小端模式:star:3. 数据范围3.1 整形溢出3.2 数据范围的求解3.3 练习:star:4. 浮点型在内存中的存储4.1 浮点数的存储规则4.2 练习5. :star::star:总结(思维导图)⭐️1. 数据类型 在了…

独立产品灵感周刊 DecoHack #048 - 优秀独立开发产品推荐

如果有关注我的 Twitter 的朋友应该看到了&#xff0c;我上周末研究了两天 AI 画图&#xff0c;现在用 Ai 做图太强了&#xff0c;上周又升级 Stable Diffusion 玩了一下&#xff0c;和我去年试的时候相比强大了好多&#xff0c;而且插件LoRA模型玩法都还在快速迭代&#xff0c…

超详细解读!数据库表分区技术全攻略

更多内容可以关注微信公众号&#xff1a;老程序员刘飞 分区的定义 分区是一种数据库优化技术&#xff0c;它可以将大表按照一定的规则分成多个小表&#xff0c;从而提高查询和维护的效率。在分区的过程中&#xff0c;数据库会将数据按照分区规则分配到不同的分区中&#xff0…

【Linux】调试工具gdb的使用

环境&#xff1a;centos7.6&#xff0c;腾讯云服务器Linux文章都放在了专栏&#xff1a;【Linux】欢迎支持订阅&#x1f339;前言在前文&#xff0c;我们已经讲解了vim工具以及gcc/g的使用&#xff0c;我们可以进行编写代码以及编译代码了&#xff0c;但是还没有学习如何在Linu…

贪心--跳跃问题/拼接问题

跳跃问题 判断能否从数轴的最左端跳跃到最右边 变形&#xff1a;最少跳跃次数 45.跳跃游戏 题目链接 给定一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 示…

博客界的至高神:属于自己的WordPress网站,你值得拥有!

【如果暂时没时间安装&#xff0c;可以直接跳转到最后先看展示效果】 很多朋友都想有一个对外展示的窗口&#xff0c;在那里放一些个人的作品或者其他想对外分享的东西。大部分人选择了在微博、公众号等平台&#xff0c;毕竟这些平台流量大&#xff0c;我们可以很轻易地把自己…

Jectpack -- Navigation了解与简单使用

简介 Navigation是一个可简化的Android导航的库和插件&#xff0c;换句话说&#xff0c;Navigation是用来规范管理Fragment的切换的&#xff0c;并且是通过可视化的方式来进行管理的。 ![[Pasted image 20230210083913.png]] 正常的跳转方法(其实有kotlin以后&#xff0c;代…

【性能测试基础】,从0到实战(手把手教,非常实用)

一、性能基础什么是性能测试--->本质?基于协议来模拟用户发送的请求&#xff08;业务模拟&#xff09;&#xff0c;对服务器形成一定负载。关注点&#xff1a;时间性能、空间性能与界面无关性能测试分类性能测试&#xff08;狭义&#xff09;性能测试方法是通过模拟生产环境…

【C++】多线程

多任务处理有两种形式&#xff0c;即&#xff1a;多进程和多线程。 基于进程的多任务处理是程序的并发执行。基于线程的多任务处理是同一程序的片段的并发执行 文章目录1. 多线程介绍2. Windows多线程1. 多线程介绍 每一个进程&#xff08;可执行程序&#xff09;都有一个主线…

AcWing1027. 方格取数

AcWing1027. 方格取数设有 NN 的方格图&#xff0c;我们在其中的某些方格中填入正整数&#xff0c;而其它的方格中则放入数字0。如下图所示&#xff1a;某人从图中的左上角 A 出发&#xff0c;可以向下行走&#xff0c;也可以向右行走&#xff0c;直到到达右下角的 B 点。在走过…

SpringBoot+Vue前后端分离管理系统02:前端

前端环境搭建 1、node环境 C:\Windows\system32>node -v v12.13.0C:\Windows\system32>npm -v 6.12.0 2、下载vue-admin-template 官网&#xff1a;介绍 | vue-element-admin 项目初始化 1、安装依赖 在刚才下载的vue-admin-template-4.4.0目录下以管理员方式运行c…

Robot Framework + Selenium2Library环境下,结合Selenium Grid实施分布式自动化测试

最近一段时间&#xff0c;公司在推行自动化测试流程&#xff0c;本人有幸参与了自定义通用控件的关键字封装和脚本辅助编写、数据驱动管理、测试用例执行管理等一系列工具软件的研发工作&#xff0c;积累了一些经验&#xff0c;在此与大家做一下分享&#xff0c;也算是做一个总…

SQL零基础入门学习(四)

SQL零基础入门学习&#xff08;三&#xff09; SQL INSERT INTO 语句 INSERT INTO 语句用于向表中插入新记录。 SQL INSERT INTO 语法 INSERT INTO 语句可以有两种编写形式。 第一种形式无需指定要插入数据的列名&#xff0c;只需提供被插入的值即可&#xff1a; INSERT …

ImageCombiner设计源码详解

前言在前面的博客中介绍了一款Java的海报生成器ImageCombiner,原文地址&#xff1a;拿来就用的Java海报生成器ImageCombiner&#xff08;一&#xff09;&#xff0c;在博文中简单介绍了一下代码以及一个真实的生成案例。但是对源码的介绍不多&#xff0c;本文就针对源码进行深入…

vs2022 x64 C/C++和汇编混编

vs2022环境x64 C/C和汇编混编vs64位程序不支持__asm内嵌汇编&#xff0c;需要单独编写汇编源文件示例如下1、新建空的win32项目&#xff0c;新建main.cpp&#xff0c;示例代码如下2、新建asm64.asm汇编源文件&#xff0c;示例代码如下3、编译器配置&#xff0c;选择x64&#xf…

【编程入门】应用市场(uni-app版)

背景 前面已输出多个系列&#xff1a; 《十余种编程语言做个计算器》 《十余种编程语言写2048小游戏》 《17种编程语言10种排序算法》 《十余种编程语言写博客系统》 《十余种编程语言写云笔记》 《N种编程语言做个记事本》 目标 为编程初学者打造入门学习项目&#xff0c;使…

华为OD机试 - 最短木板长度(C++) | 附带编码思路 【2023】

刷算法题之前必看 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:https://blog.csdn.net/hihell/category_12199283.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 华为OD机试题…

PowerJob容器的前世,容器是如何产生,如何上传到Server上去的

这不仅仅是一篇PowerJob源码分析的文章&#xff0c;还有很多的java基础知识&#xff0c;在实践中学习效果更好&#xff0c;感兴趣就留下来交流一下吧。 power容器虽然说是容器&#xff0c;但并不是docker容器&#xff0c;仅仅就是java的jar包 &#xff0c;可以通过框架下载一套…

手工测试混了5年,年底接到了被裁员的消息....

大家都比较看好软件测试行业&#xff0c;只是因为表面上看起来&#xff1a;钱多事少加班少。其实这个都是针对个人运气好的童人才会有此待遇。在不同的阶段做好不同阶段的事情&#xff0c;才有可能离这个目标更近&#xff0c;作为一枚软件测试人员&#xff0c;也许下面才是我们…