Vue05_关于插槽和指令封装的运用

news2024/11/24 6:56:12

Vue_05

文章目录

  • Vue_05
    • Vue 插槽
      • 01-插槽-默认插槽
          • 默认插槽-基本语法
      • 02-插槽-后备内容(默认值)
          • 默认值设置方法
      • 03-插槽-具名插槽
          • 具名插槽-语法
      • 04-插槽-作用域插槽
          • 默认插槽-语法
          • 代码示例
    • Vue自定义指令- v-loading封装
      • 01-自定义指令
          • 自定义指令的两种注册语法:
      • 03-自定义指令- v-loading指令封装
    • 商品列表综合练习
      • 核心步骤
      • 创建组件
      • 1. MyTag组件详细步骤
        • 双击显示,自动聚焦
        • 失去焦点,隐藏输入框
      • 回显标签信息
      • 回车修修改内容,同时隐藏输入框
      • MyTable组件详细步骤
        • 1-动态的设置整个表格的数据 : props
        • 2-实现自定义结构-插槽
          • 1-表头自定义
          • 2-主体定制
      • 完整代码
          • App.vue组件
          • MyTab.vue组件
          • MyTable组件
      • 最终效果图:

Vue 插槽

插槽的作用:让组件内部的一些 结构 支持自定义。

例如:我们需要再页面中显示一个对话框,将其封装成一个组件。

当我们希望组件内容部分,不希望写死,就得用插槽来解决

插槽的分类:

  1. 默认插槽: 组件内定制一处结构
  2. 具名插槽:组件内定制多处结构
    • 作用于插槽:是插槽的一个传参语法

01-插槽-默认插槽

默认插槽-基本语法
  1. 组件内需要定制的结构部分,使用占位
  2. 使用组件时,标签内部,传入结构替换slot。

基本使用

MyDialog组件
1.组件内需要定制的结构部分,使用<slot></slot>占位

    <div class="dialog-content">
      <!-- 1. 在需要定制的位置,使用slot占位 -->
        <slot></slot>
    </div>



App.vue组件
2.使用组件时,<MyDialog></MyDialog>标签内部,传入结构替换slot。

  <div class="app">
    <!-- 2. 在使用组件时,组件标签内填入内容 -->
    <MyDialog>
      <div>你确认要退出么</div>
    </MyDialog>
    <MyDialog>
      <p>你确认要删除吗</p>
      <p>你确认要删除吗</p>
      <p>你确认要删除吗</p>
    </MyDialog>
  </div>


02-插槽-后备内容(默认值)


通过插槽完成了内容的定制,传什么显示什么,但是如果我们在组件使用的时候,不传,则是空白

那么能否给插槽设置 默认显示内容呢?

默认值设置方法
  • **语法:**在标签内,放置内容,这里面的内容会被默认显示。
  • 当组件使用时传给了内容则不会显示标签里面的默认内容
MyDialog组件
1.
    <div class="dialog-content">
      <!-- 往slot标签内部,编写内容(会被作为后备默认内容) -->
        <slot>我是默认的插槽内容</slot>
    </div>

App.vue组件
  <div class="app">
      //一个不传值,一个传值
    <MyDialog></MyDialog>

    <MyDialog>
      我传递了内容哦!
    </MyDialog>
  </div>

说白了就是当不给组件传值的时候,就显示slot标签内部的内容。


03-插槽-具名插槽


当一个组件有多个结构,需要进行定制内容

此时的默认插槽是无法解决该问题

默认插槽:只能有一个定制位置

所以,得使用具名插槽来解决


具名插槽-语法
  1. 使用多个 slot 标签 ,并且使用 name 属性区分名字
  2. template配合 v-slot:名字 来分发对应标签
  3. 简写:v-slot:插槽名 → 可以简写为 #插槽名

MyDialog组件
1. 
<div class="dialog-header">
      <!-- 一但插槽起了名字,就是具名插槽,(只支持定向分发) -->
      <slot name="head"></slot>
    </div>
    <!-- 内容 -->
    <div class="dialog-content">
        <slot name="content"></slot>
    </div>
    <!-- 底部 -->
    <div class="dialog-footer">
      <slot name="footer"></slot>
    </div>


App.vue组件
2.切记用template包裹起来,根据插槽名分发内容

    <MyDialog>
      <!-- 需要通过template包裹,template配合 v-slot:名字 来分发对应标签 -->
      <template v-slot:head>
        <div>我是大标题</div>
      </template>

      <template v-slot:content>
        <div>我是内容</div>
      </template>
      <!-- 简写#插槽名 -->
      <template #footer>
        <button>确认</button>
        <button>取消</button>
      </template>
    </MyDialog>


04-插槽-作用域插槽


作用于插槽:定义slot插槽的同时,是可以传值的。给 插槽 上可以 绑定数据,将来 使用组件时可以使用。


使用场景:封装表格组件

  1. 父传子,动态渲染表格内容
  2. 利用默认插槽,定制操作列表
  3. 删除或查看都需要用到 当前项 的 id ,数组组件内部数据(通过作用域插槽 传值绑定,进而使用)

默认插槽-语法
  1. 给 slot 标签 ,以添加属性的方式传值

<slot :id="item.id" msg="测试"></slot>

  1. 所有添加的属性,都会被收集到一个对象中

    { id: 3 , msg: '测试'}

  2. 在 template中,通过 #插槽名="obj"接收,默认插槽名为: default → #default="obj"


这里使用一个简单的表格删除和查询来练习插槽

代码示例

首先是我们呢的子组件代码

<template>
  <table class="my-table">
    <thead>
      <tr>
        <th>序号</th>
        <th>姓名</th>
        <th>年纪</th>
        <th>操作</th>
      </tr>
    </thead>
    <tbody>
      <tr v-for="(item,index) in data" :key="item.id">
        <td>{{ index + 1 }}</td>
        <td>{{ item.name }}</td>
        <td>{{ item.age }}</td>
        <td>
          
          <!-- 定义插槽的同时,可以传值哦(使用插槽作用域) -->
          <!-- 1. 给slot标签,添加属性的方式传值 -->
          <slot :row="item" msg="测试">默认插槽</slot>

          <!-- 2. 将所有的属性添加到一个对象中 -->
          <!-- 
                {
                  row : {id: 2 ,name: "孙大明", age: 19},
                  msg: '测试文本'
                }
           -->
        </td>
      </tr>
    </tbody>
  </table>
</template>

<script>
export default {
props: {
  data: Array
}
}
</script>

App.vue父组件代码

<template>
  <div>
    <MyTable :data="list">
      <!-- 3. 通过template #插槽名="变量名" 接收 -->
      <template #default = "obj">
        <button @click="del(obj.row.id)">删除</button>
      </template>
    </MyTable>
    
    <MyTable :data="list2">
      <!-- 这里是一样的:需要使用template包裹 -->
      <template #default="{row}">
        <button @click="look(row)">查看</button>
      </template>
    </MyTable>
  </div>
</template>

<script>
import MyTable from './components/MyTable.vue'
export default {
  data () {
    return {
      list: [
        { id: 1, name: '张小花', age: 18 },
        { id: 2, name: '孙大明', age: 19 },
        { id: 3, name: '刘德忠', age: 17 },
      ],
      list2: [
        { id: 1, name: '赵小云', age: 18 },
        { id: 2, name: '刘蓓蓓', age: 19 },
        { id: 3, name: '姜肖泰', age: 17 },
      ]
    }
  },
  methods: {
    del (id) {
      // 删除功能:使用filter过滤
      this.list = this.list.filter( item => item.id !== id)
    },
    look (row) {
      alert(`姓名:${row.name};  年纪:${row.age}`)
    }
  },
  components: {
    MyTable
  }
}
</script>

在这里插入图片描述

  • 这里主要讲解了插槽的语法和基本的使用。

Vue自定义指令- v-loading封装

01-自定义指令


什么是自定义指令?

  • 自定义指令:自己定义的指令,可以封装一些dom操作,扩展额外功能。

1、例如:完成自动聚焦的功能:

自定义指令的两种注册语法:
  • 全局注册-语法:
// 全局注册指令
Vue.directive('focus',{
  // inserted会在 指令所在的元素,被插入到页面中的时候触发
  inserted (el) {
    // el 就是我们指令所绑定的元素
    el.focus()
  }
})
  • 局部注册-语法:
  // 2.局部注册指令
  directives: {
    // 指令名:指令配置项
    focus: {
      // el 是我么指令所绑定的元素
      inserted (el) {
        el.focus()
      }
    }
  }

根据使用场景:选择不同的注册方式。


### 02自定义指令的值

2、例如:实现一个color指令 - 传入不同的颜色,给标签设置文字颜色

语法

我们再绑定指令的时候,可以通过 等号 给我们指令绑定具体的参数。

v-指令名=“指令值”,绑定指令的值

<div v-color="color">我是内容</div>

通过 binding.value可以可以拿到指令值,指令值修改会 触发 update 函数

binding.value可以拿到color的值,当我们指令被修改后,会执行update函数

  <div class="app">
    <h1 v-color="color1">指令的值1</h1>
    <h1 v-color="color2">指令的值2</h1>
  </div>


<script>
export default {
  data () {
    return {
      color1: 'red',
      color2: 'green'
    }
  },
    // 注册自定义指令
  directives: {
    color: {
      // 1、inserted 元素被添加到页面时的逻辑
      inserted (el,binding) {
        // binding.value 就是指令的值
        el.style.color = binding.value
      },
      // 2、update 指令的值修改的时候触发,提供dom更新后的逻辑
      update (el, binding) {
        el.style.color = binding.value
      }
    }
  }
}
</script>

03-自定义指令- v-loading指令封装


分析 v-loading指令封装

  1. 本质 loading 效果就是一个蒙层,盖在了盒子上
  2. 数据请求中,开启loading状态,添加蒙层
  3. 数据请求完毕后,关闭loading装状态,移除蒙层。

实现:

  1. 准备一个 loading 类,通过伪元素定位,设置宽高,实现蒙层

  2. 开启关闭蒙层状态(添加移除蒙层),本质只需要添加移除类即可

  3. 结合自定义指令的语法进行封装


  <div class="box" v-loading="isLoading">

<script>
// 安装axios =>  yarn add axios
import axios from 'axios'

// 接口地址:http://hmajax.itheima.net/api/news
// 请求方式:get
export default {
  data () {
    return {
      list: [],
      isLoading: true
    }
  },
  // 定义局部指令
  directives: {
    loading: {
      inserted (el,binding) {
        // 指令触发后执行当前钩子  inserted
        binding.value ? el.classList.add('loading') : el.classList.remove('loading')
      },
      update (el,binding) {
        // 指令值被修改执行当前钩子 update
        binding.value ? el.classList.add('loading') : el.classList.remove('loading')
      }
    }
  },
  async created () {
    // 1. 发送请求获取数据
    const res = await axios.get('http://hmajax.itheima.net/api/news')
    
    setTimeout(() => {
      // 2. 更新到 list 中,用于页面渲染 v-for
      this.list = res.data.data
      // 数据响应后,改变蒙层状态
      this.isLoading = false
    }, 2000)
  }
}
</script>
      
      
<style>
.loading:before {
  content: '';
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  background: #fff url('./loading.gif') no-repeat center;
}
</style>


商品列表综合练习


@[toc]

[外链图片转存中…(img-AOMZCmKC-1693238901398)]

核心步骤

MyTag 组件的封装

  1. 创建组件 → 初始化

  2. 实现功能

    (1)双击显示,并开启自动聚焦

​ 1. v-if v-else @dblclick

​ 2. 通过注册全局的自定义指令获取焦点 focus

(2)失去焦点的时候,隐藏输入框

​ 1. 然后使用@blur失去焦点隐藏

(3)回显标签信息

  1. 回显的标签信息是父组件传递过来的

    1. 使用 v-model 实现功能(简化代码)
    2. v-model ===> :value 和 @input

    (4)内容修改了,回车 → 修改标签信息

​ 1. @keyup.enter ,触发了回车事件 执行 $emit(‘input’,e.target.value)

​ 2. 然后父组件中的 v-model 底层的 @input自动帮我们执行数据渲染回显


My-Table 表格组件的封装

  1. 数据不能写死,需要动态的传递表格渲染数据

​ 使用: props

  1. 结构不能写死 → 多处结构实现自定义 → 具名插槽

    (1) 表头需要支持自定义

    (2) 主体支持自定义


创建组件

  1. 创建组件 → 初始化

    在这里插入图片描述

1.导入
import MyTag from './components/MyTag.vue'
import MyTable from './components./Mytable.vue'

2. 注册
components: {
    MyTag,
    MyTable
}

3. 使用
<MyTag></MyTag>
<MyTable></MyTable>

1. MyTag组件详细步骤

双击显示,自动聚焦

1.双击显示

1.双击显示   
<div v-else @dblclick="handleedit" class="text">{{ value }}</div>

//提供以下方法
    handleedit() {
      // 双击切换到显示状态
      this.isShow = true;
    },

2 自动聚焦

2.自动聚焦
// 封装全局自定义指令(实现获取焦点),当然可以使用$nextTick解决同步Vue的问题,达到异步更新效果
Vue.directive('focus', {
  // el 是我们指令所在的dom元素
  inserted (el) {
    el.focus()
  }
})

在这里插入图片描述


失去焦点,隐藏输入框

  1. 失去焦点,隐藏输入框

    使用blur事件失去焦点,然后将isShow改为false
    @blur="isShow = false"
    

回显标签信息

在我们双击了触发了编辑功能后,显示了输入框,然后再自动获得focus。

  • 现在我们需要回显了
  1. 使用v-model将父组件的值传递过来

  2. 然后子组件使用 props 接受 进行操作

  3. 给组件绑定 v-model 指令

    <MyTag v-model="item.tag"></MyTag>
    
  4. props接收数据,并回显渲染

    1. props接收数据
      // 接收父组件传过来的数据  :value
      props: {
        value: String,
      },
      
     2. 回显渲染
       //将数据动态的赋值给我们的需要显示的标签
       :value="value"
    

    回车修修改内容,同时隐藏输入框

    1. 绑定回车事件 @keyup.enter=“方法名”
    @keyup.enter="handleEnter"
    
    1. 提供对应方法: handleEnter()
    1. 通过$emit('事件名',传递的值) 通知父组件
    methods: {
        handleEnter (e) {
           //子传父,将获取到的输入框给父组件,通知他修改渲染标签
            if (e.target.value.trim() === '') {
                alert('修改的内容不能为空')
                return 
                //通过 input事件 同志父组件监听,并修改输入框内容
                this.$emit('input',e.target.value)
            }
        }
    }
    2. 回车后,输入框隐藏
    this.isShow = false
    

    到此,我们的编辑功能组件实现完毕


MyTable组件详细步骤

1-动态的设置整个表格的数据 : props

  1. 数据在App.vue中,使用父传子实现

    1. 动态的属性传递数据
    <MyTable :data="item.goods"></MyTable>
    
    
    2. 接收数据
    props: {
        data: {
            type: Array,
            required: true  控制判断
        }
    }
    

2-实现自定义结构-插槽

  1. 表头自定义
  2. 主体自定义
  • 目的是为了,我们能够灵活的实现结构和数据对应

  • 记得在相应的组件中使用 : 占好位置
1-表头自定义
1.表头自定义:切记使用具名插槽,因为我们需要在定制的时候,用到相互之间的数据。    
<!-- 使用插槽动态的定制了表头结构 -->
      <template #head>
        <th>编号</th>
        <th>名称</th>
        <th>图片</th>
        <th width="100px">标签</th>
      </template>


在这里插入图片描述

2-主体定制
2. 主体定制:同样的使用具名插槽,需要制定并且传递该组件的数据   
<!-- 使用插槽作用域传递值,定制主体的内容 -->
      <template #body="{ item, index }">
        <td>{{ index + 1 }}</td>
        <td>{{ item.name }}</td>
        <td>
          <img :src="item.picture" />
        </td>
        <td>
          <MyTag v-model="item.tag"></MyTag>
        </td>
      </template>

在这里插入图片描述

编辑渲染功能和自定义结构功能就实现完毕了


完整代码

App.vue组件
<template>
  <div class="table-case">
    <MyTable :data="goods">
      <!-- 使用插槽动态的定制了表头结构 -->
      <template #head>
        <th>编号</th>
        <th>名称</th>
        <th>图片</th>
        <th width="100px">标签</th>
      </template>

      <!-- 使用插槽作用域传递值,定制主体的内容 -->
      <template #body="{ item, index }">
        <td>{{ index + 1 }}</td>
        <td>{{ item.name }}</td>
        <td>
          <img :src="item.picture" />
        </td>
        <td>
          <MyTag v-model="item.tag"></MyTag>
        </td>
      </template>
    </MyTable>
  </div>
</template>

--------------------------------------------------------
<script>
export default{
import MyTag from './components/MyTag.vue'
import MyTable from "./components/MyTable.vue";
export default {
  // 2.注册组件
  components: {
    MyTag,
    MyTable,
  },
  name: "TableCase",
  data() {
    return {
      tempText: "水杯",
      tempText2: "钢笔",
      goods: [
        {
          id: 101,
          picture:
            "https://yanxuan-item.nosdn.127.net/f8c37ffa41ab1eb84bff499e1f6acfc7.jpg",
          name: "梨皮朱泥三绝清代小品壶经典款紫砂壶",
          tag: "茶具",
        },
        {
          id: 102,
          picture:
            "https://yanxuan-item.nosdn.127.net/221317c85274a188174352474b859d7b.jpg",
          name: "全防水HABU旋钮牛皮户外徒步鞋山宁泰抗菌",
          tag: "男鞋",
        },
        {
          id: 103,
          picture:
            "https://yanxuan-item.nosdn.127.net/cd4b840751ef4f7505c85004f0bebcb5.png",
          name: "毛茸茸小熊出没,儿童羊羔绒背心73-90cm",
          tag: "儿童服饰",
        },
        {
          id: 104,
          picture:
            "https://yanxuan-item.nosdn.127.net/56eb25a38d7a630e76a608a9360eec6b.jpg",
          name: "基础百搭,儿童套头针织毛衣1-9岁",
          tag: "儿童服饰",
        },
      ],
    };
  },
};
</script>


MyTab.vue组件
<template>
  <div class="my-tag">
    <input
      v-if="isShow"
      v-focus
      @blur="isShow = false"
      :value="value"
      @keyup.enter="handleEnter"
      class="input"
      type="text"
      placeholder="输入标签"
    />
    <div v-else @dblclick="handleedit" class="text">{{ value }}</div>
  </div>
</template>


---------------------------------------------------
        
        
 <script>
export default {
  // 接收父组件传过来的数据  :value
  props: {
    value: String,
  },
  data() {
    return {
      isShow: false,
    };
  },
  methods: {
    handleedit() {
      // 双击切换到显示状态
      this.isShow = true
    },
    handleEnter(e) {
      // 子传父,将{输入框的内容}传递给我们的父组件,通知他叫他渲染
      //   由于父组件是  v-model  所以触发事件为  @input
      if (e.target.value.trim() === "") return alert("修改内容不能为空")
        this.$emit("input", e.target.value)
        //   回车后输入框隐藏
        this.isShow = false
    },
  },
};
</script>


MyTable组件
<template>
  <table class="my-table">
    <thead>
      <tr>
        <slot name="head"></slot>
      </tr>
    </thead>
    <tbody>
      <tr v-for="(item,index) in data" :key="item.id">
        <slot name="body" :item = item :index = index></slot>
      </tr>

    </tbody>
  </table>
</template>


----------------------------------------------------


<script>
export default {
  props: {
    data: {
      type: Array,
      required: true
    }
  }
}
</script>

最终效果图:

在这里插入图片描述


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

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

相关文章

【算法专题突破】双指针 - 盛最多水的容器(4)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后&#xff1a; 1. 题目解析 题目链接&#xff1a;11. 盛最多水的容器 - 力扣&#xff08;Leetcode&#xff09; 这道题目也不难理解&#xff0c; 两边的柱子的盛水量是根据短的那边的柱子决定的&#xff0c; 而盛水量…

如何清空小程序会员卡的电子票

​电子票不仅方便了用户的购票和消费&#xff0c;还提升了用户的购物体验和忠诚度。然而&#xff0c;在一些特殊情况下&#xff0c;可能需要手动清空会员的电子票。那么&#xff0c;下面我们就来探讨一下在小程序中如何手动清空会员的电子票。 1. 找到指定的会员卡。在管理员后…

15.CSS发光按钮的悬停特效

效果 源码 <!DOCTYPE html> <html> <head><title>CSS Modern Button</title><link rel="stylesheet" type="text/css" href="style.css"> </head> <body><a href="#" style=&quo…

Flink CDC学习笔记

第一章 CDC简介 1.1 什么是CDC ​ CDC (Change Data Capture 变更数据获取&#xff09;的简称。核心思想就是&#xff0c;检测并获取数据库的变动&#xff08;增删查改&#xff09;&#xff0c;将这些变更按发生的顺序记录下来&#xff0c;写入到消息中间件以供其它服务进行订…

公网远程访问局域网SQL Server数据库

文章目录 1.前言2.本地安装和设置SQL Server2.1 SQL Server下载2.2 SQL Server本地连接测试2.3 Cpolar内网穿透的下载和安装2.3 Cpolar内网穿透的注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 数据库的重要性相信大家都有所了解&…

Deep Learning With Pytorch - 数据预处理,以导入LUNA16数据集为例

文章目录 数据集简介什么是CT扫描&#xff1f;导入大型数据集并不是一份轻松的工作 在Jupyter Notebook中导入LUNA16数据集导入可能用到的第三方库&#xff1a;LUNA16存放路径&#xff1a;用 pandas 读取 candidates.csv&#xff1b;读取 annotations.csv导入subset0和subset1的…

[FPGA IP系列] BRAM IP参数配置与使用示例

FPGA开发中使用频率非常高的两个IP就是FIFO和BRAM&#xff0c;上一篇文章中已经详细介绍了Vivado FIFO IP&#xff0c;今天我们来聊一聊BRAM IP。 本文将详细介绍Vivado中BRAM IP的配置方式和使用技巧。 一、BRAM IP核的配置 1、打开BRAM IP核 在Vivado的IP Catalog中找到B…

ubuntu上安装nginx

这篇文章主要介绍怎么在ubuntu上安装nginx服务器&#xff0c;并配置简单的反向代理功能。 第一步&#xff1a;准备好一台ubuntu操作系统的虚拟机 注意&#xff1a;如果你还没有安装好ubuntu&#xff0c;个人推荐阅读以下文章完成unbutu安装&#xff0c;vm的版本不用刻意安装文…

Python ArcPy将多个文件夹内大量遥感影像批量四等分裁剪或切割为N×M个部分

本文介绍基于Python中的ArcPy模块&#xff0c;基于一个大文件夹&#xff0c;遍历其中每一个子文件夹中所有的遥感影像栅格文件&#xff0c;并将原本的每一景遥感影像文件四等分切割&#xff0c;或裁剪为其他指定个数的小块的方法。 首先明确一下我们的需求。现有一个大文件夹&a…

数据结构之单链表java实现

基本概念 链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中指针链接次序实现的。和数组相比较&#xff0c;链表不需要指定大小&#xff0c;也不需要连续的地址。 单链表的基本设计思维是&#xff0c;利用结构体的设置&#xff0c…

平衡二叉树(AVL树)C++

目录 AVL树的概念 AVL树的节点结构 AVL树的插入 更新平衡节点 代码实现 AVL树的旋转 左单旋 右单旋 左右双旋 右左双旋 AVL树的删除 AVL树的查找 AVL树的高度 AVL树的判定 AVL树的遍历 AVL树的概念 二叉排序&#xff08;搜索&#xff09;树&#xff0c;虽然可以…

葡萄叶病害识别(图像连续识别和视频识别,Python代码,pyTorch框架)

葡萄叶病害识别&#xff08;图像连续识别和视频识别&#xff0c;Python代码&#xff0c;pyTorch框架&#xff09;_哔哩哔哩_bilibili 葡萄数据集 第一个文件夹为 Grape Black Measles&#xff08;葡萄黑麻疹&#xff09;病害&#xff08;3783张&#xff09; Grape Black rot葡…

108页石油石化5G智慧炼化厂整体方案PPT

导读&#xff1a;原文《108页石油石化5G智慧炼化厂整体方案PPT》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。以下是部分内容&#xff0c; P P T 喜欢文章&#xf…

【BUG事务内消息发送】事务内消息发送,事务还未结束,消息发送已被消费,查无数据怎么解决?

问题描述 在一个事务内完成插入操作&#xff0c;通过MQ异步通知其他微服务进行事件处理。 由于是在事务内发送&#xff0c;其他服务消费消息&#xff0c;查询数据时还不存在如何解决呢&#xff1f; 解决方案 通过spring-tx包的TransactionSynchronizationManager事务管理器解…

管理与领导-58]:IT基层管理者 - 扩展技能 - 1 - 时间管理 -5- 持续改进— 时间管理的好习惯

前言&#xff1a; 对于大多数管理者而言&#xff0c;提高效能并不能一步到位&#xff0c;需要不断的实践、总结、持续的改进和优化&#xff0c;最终达到较高的效能&#xff0c;持续学习、持续改进是管理者一项终身精进的能力&#xff01;&#xff01;&#xff01;养成时刻进行…

程序员赚钱的六种方式:技术实力和市场分析能力是关键

随着互联网的普及和发展&#xff0c;越来越多的人开始在网上寻找商机&#xff0c;其中程序员作为一个高技能的群体&#xff0c;可以利用自身的编程技术在网上获得收益。以下是一些程序员可以利用自己的编程技术在网上赚钱的途径&#xff1a; 开发软件&#xff1a;程序员可以利…

Spring Boot(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot 前后端分离)【五】

&#x1f600;前言 本篇博文是关于Spring Boot(Vue3ElementPlusAxiosMyBatisPlusSpring Boot 前后端分离)【五】&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章…

本地组策略编辑器找不到怎么解决?| 解决windows home 版本隐藏本地组策略编辑器的问题 | 简单的介绍本地组策略编辑器

一般的 Windows 非家庭系统中&#xff0c;本地组策略编辑器不会被隐藏&#xff0c;但在某些特定情况下&#xff0c;可能会受到限制或不可用。如果你无法访问本地组策略编辑器&#xff0c;并且认为应该可以访问&#xff0c;请确保你拥有管理员权限&#xff0c;并检查是否有任何系…

golang-bufio 缓冲读

缓冲 IO 计算机中我们常听到这样的两种程序优化方式&#xff1a; 以时间换空间以空间换时间 今天要来看的缓冲IO就是典型的以空间换时间&#xff0c;它的基本原理见上图。简单的解释就是&#xff1a;程序不再直接去读取底层的数据源&#xff0c;而是通过一个缓冲区来进行读取…

SPI3+DMA外设驱动-TFTLCD初始化

前言 &#xff08;1&#xff09;本系列是基于STM32的项目笔记&#xff0c;内容涵盖了STM32各种外设的使用&#xff0c;由浅入深。 &#xff08;2&#xff09;小编使用的单片机是STM32F105RCT6&#xff0c;项目笔记基于小编的实际项目&#xff0c;但是博客中的内容适用于各种单片…