Vue2基础知识(二) 计算属性/侦听器/生命周期

news2024/11/17 14:23:57

在这里插入图片描述

  • 💌 所属专栏:【Vue2】
  • 😀 作 者:长安不及十里
  • 💻工作:目前从事电力行业开发
  • 🌈目标:全栈开发
  • 🚀 个人简介:一个正在努力学技术的Java工程师,专注基础和实战分享 ,欢迎咨询!
  • 💖 欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信 😘 😘 😘
  • 📌 格言:把戏把戏要过手

目录

  • 一 计算属性
    • 1.1 理解
    • 1.2 getter和setter
    • 1.3 方法
    • 1.4 侦听属性
    • 1.5 完整写法
  • 二 生命周期
  • 三 数据检测的原理

一 计算属性

image.png

1.1 理解

🌈如何来理解计算属性?
Vue的计算属性是一个能够基于现有的Vue实例数据进行计算的属性,它们的值是根据依赖的数据动态计算而来的,只有在依赖的数据发生变化时才会重新计算,计算属性常常用于模板表达式中,可以将复杂的逻辑计算封装在计算属性中,使模板更加简洁清晰。
我的理解:通过原有的数据动态计算,才能得一个新的属性
🌈几个概念?

  1. 计算属性是基于现有的Vue实例数据进行计算的属性,它们的值是根据依赖的数据动态计算而来的。
  2. 计算属性具有缓存特性,只有在依赖的数据发生变化时才会重新计算。
  3. 计算属性可以被用作模板表达式中的数据绑定。
  4. 计算属性支持getter和setter方法,可以通过setter方法实现数据的双向绑定。
<!--
* @Description: 计算属性的理解
* @version: 1.0
* @Author: shu
* @Date: 2023-04-16 16:14:12
* @LastEditors: 修改者填写
* @LastEditTime: 2023-04-16 16:21:04
-->
  <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>计算属性</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>

      <body>
      <div id="app">
      <div>
      <p>商品名称:{{ product.name }}</p>
      <p>商品价格:{{ salePrice }}</p>
      <button @click="product.discount = 0.5">打五折</button>
      </div>
      </div>
      <script>
      var app = new Vue({
      el: '#app',
      data: {
        product: {
          name: '电视机',
          price: 1000,
          discount: 0.8
        }
      },
      computed: {
        salePrice() {
          return this.product.price * this.product.discount
        }
      }
    })
    </script>

    </html>

动画.gif
上面的例子中,我们定义了一个商品对象,其中包含了商品的名称、价格和折扣,我们通过计算属性salePrice来计算商品的实际售价,然后在模板表达式中使用它来显示商品的价格,由于salePrice是一个计算属性,它的值会随着商品价格和折扣的变化而动态更新,在这个例子中,我们只需要更新商品对象的价格和折扣属性,就可以实现商品价格的实时更新。

1.2 getter和setter

计算属性拥有的两个方法:getter setter 用来实现数据的双向绑定

  • 每一个计算属性都包含一个 getter 和一个 setter,我们上面的两个示例都是计算属性的默认用法 , 只是利用了 getter来读取。在你需要时,也可以提供一个 setter 函数 , 当手动修改计算属性的值就像修改一个普通数据那样时,就会触发 setter函数,执行一些自定义的操作
  • 计算属性除了上述简单的文本插值外,还经常用于动态地设置元素的样式名称 class 和内联样式 style
<!--
 * @Description: get与set方法
 * @version: 1.0
 * @Author: shu
 * @Date: 2023-04-16 16:29:23
 * @LastEditors: 修改者填写
 * @LastEditTime: 2023-04-16 16:29:23
-->
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>get与set方法</title>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>

<body>
  <div id="app">
<div>
    <div>{{ formSum.sum }}</div>
    <div><button @click="buttonPlusClcik">加点击</button></div>
    <div>{{ dataSum.sum }}</div>
    <div><button @click="buttonReduceClcik">减点击</button></div>
    <!-- 总和展示 -->
    <div>{{ theSum }}</div>
  </div>
  </div>
  <script>
    var app = new Vue({
      el: '#app',
      data: {
        formSum: {
          sum: 0,
          sumbutton: 100,
        },
        dataSum: {
          sum: 10,
          sumbutton: 1000,
        },
      },
      computed: {
        theSum: {
          get() {
            return this.formSum.sum + this.dataSum.sum
          },
          set(value) {
            this.formSum.sum = value
            this.dataSum.sum = value
          }
        }
      },
      methods: {
        // 加点击
        buttonPlusClcik() {
          this.theSum++
        },
        // 减点击
        buttonReduceClcik() {
          this.theSum--
        }
      }
    })
  </script>



</html>

1.3 方法

我们将上面的案例来改写一种方法,定义方法来写,它有是如何写的呢?

<!--
 * @Description: 方法
 * @version: 1.0
 * @Author: shu
 * @Date: 2023-04-16 16:29:23
 * @LastEditors: 修改者填写
 * @LastEditTime: 2023-04-16 16:30:34
-->

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>方法</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>

<body>
    <div id="app">
        <div>
            <p>商品名称:{{ product.name }}</p>
            <p>商品价格:{{ salePrice() }}</p>
            <button @click="product.discount = 0.5">打五折</button>
        </div>
    </div>
    <script>
        var app = new Vue({
            el: '#app',
            data: {
                product: {
                    name: '电视机',
                    price: 1000,
                    discount: 0.8
                }
            },
            methods: {
                salePrice() {
                    return this.product.price * this.product.discount
                }
            }
        })
    </script>

</html>

动画.gif
我们可以发现效果是一样的,但是这其实是有区别的?
⏺️使用计算属性的好处是,它具有缓存特性,只有在依赖的数据发生变化时才会重新计算,因此效率更高。
⏺️而使用methods的方法则需要每次调用都重新计算,因此效率较低,此外,使用计算属性还可以将计算逻辑封装在属性中,使代码更加清晰简洁。
⏺️总之,使用计算属性可以提高代码的可读性和可维护性,同时也可以提高程序的运行效率,但是如果逻辑比较复杂或需要处理异步操作,可能需要使用methods来实现。
image.png

1.4 侦听属性

image.png
🌈如何理解帧听属性?
Vue中的侦听属性(watch)是一个很有用的特性,它可以让开发者监听某个特定的数据属性,并在其发生变化时执行一些特定的操作,侦听属性通常用于处理需要在特定属性发生变化时进行异步操作或复杂逻辑处理的情况。

<!--
 * @Description: 侦听属性
 * @version: 1.0
 * @Author: shu
 * @Date: 2023-04-16 16:46:33
 * @LastEditors: 修改者填写
 * @LastEditTime: 2023-04-16 16:46:33
-->
<!DOCTYPE html>
<html lang="en">


<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>侦听属性</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>

<body>
    <div id="app">
        <div>
            <p>商品名称:{{ product.name }}</p>
            <p>商品价格:{{ product.price }}</p>
            <p>商品折扣:{{ product.discount }}</p>
            <p>商品折后价:{{ salePrice }}</p>
            <button @click="product.discount = 0.5">打五折</button>
        </div>
    </div>
    <script>
        var app = new Vue({
            el: '#app',
            data: {
                product: {
                    name: '电视机',
                    price: 1000,
                    discount: 0.8
                }
            },
            computed: {
                salePrice() {
                    return this.product.price * this.product.discount
                }
            },
            watch: {
                'product.discount': function (newVal, oldVal) {
                    console.log('newVal: ' + newVal)
                    console.log('oldVal: ' + oldVal)
                }
            }
        })
    </script>
</html>

动画.gif
我们可以发现对我们指定的属性进行监听,可以发现一个新值,与旧值,这就方便我们进行一些特定的操作
🌈如何来决定何时使用计算属性与帧听属性?
在Vue中,使用计算属性和侦听属性都可以处理特定的数据变化,但它们的使用场景是不同的,通常来说,当我们需要计算一些值,并将其作为属性暴露给模板时,可以使用计算属性,而当我们需要在某些数据发生变化时,执行一些异步或复杂的操作,可以使用侦听属性。
具体来说,计算属性适用于以下情况:

  • 当需要根据某些数据计算出一个值,并在模板中显示时,可以使用计算属性。例如,计算商品的折扣价格、根据用户输入的关键字过滤数据等等。
  • 当需要根据其他属性或状态更新某个属性时,可以使用计算属性。例如,在计算属性中根据用户选择的语言切换页面显示的文字。

侦听属性适用于以下情况:

  • 当需要在特定数据发生变化时执行异步或复杂操作时,可以使用侦听属性。例如,当用户选择某个城市时,需要通过网络请求获取该城市的天气信息。
  • 当需要监听多个数据变化,并在它们发生变化时执行某些操作时,可以使用侦听属性。例如,当商品数量或价格发生变化时,需要重新计算购物车中的总价。

需要注意的是,使用计算属性和侦听属性时需要注意性能问题,计算属性具有缓存机制,只有在依赖的数据发生变化时才会重新计算,因此不会因为频繁计算而降低性能,而侦听属性则不具有缓存机制,每当侦听的属性变化时都会执行一次处理函数,如果处理函数比较耗时,可能会影响页面的性能。
综上所述,使用计算属性和侦听属性时需要根据具体的业务场景和数据变化的情况进行选择,同时也需要注意性能问题。

1.5 完整写法

image.png

<!--
 * @Description: 侦听属性
 * @version: 1.0
 * @Author: shu
 * @Date: 2023-04-16 16:46:33
 * @LastEditors: 修改者填写
 * @LastEditTime: 2023-04-16 16:46:33
-->
<!DOCTYPE html>
<html lang="en">


<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>侦听属性</title>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>

<body>
  <div id="app">
    <div>
      <p>商品名称:{{ product.name }}</p>
      <p>商品价格:{{ product.price }}</p>
      <p>商品折扣:{{ product.discount }}</p>
      <p>商品折后价:{{ salePrice }}</p>
      <button @click="product.discount = 0.5">打五折</button>
    </div>
  </div>
  <script>
    Vue.config.devtools = true;
    var app = new Vue({
      el: '#app',
      data: {
        product: {
          name: '电视机',
          price: 1000,
          discount: 0.8
        }
      },
      computed: {
        salePrice: {
          get() {
            return this.product.price * this.product.discount
          }
        }
      },
      watch: {
        product: {
          //  //  对复杂数据类型的监听
          deep: true,
          //  立即执行
          immediate: true,
          // 侦听属性
          handler(newVal, oldVal) {
            console.log('newVal: ' + newVal)
            console.log('oldVal: ' + oldVal)
          },
        },
      }
    })
  </script>
</html>

如果对象内有多个属性,并采用以下写法,则对象内每个属性都会被侦听,每个属性的变化都会执行一次侦听操作。

二 生命周期

image.png
image.png
Vue生命周期是指在一个Vue实例创建、更新和销毁过程中,各个阶段发生的事件和回调函数。Vue的生命周期分为以下8个阶段:

  1. 创建前(beforeCreate):在实例被创建之前调用,此时实例的属性和方法都没有被初始化。
  2. 创建后(created):在实例被创建之后立即调用,此时实例已经完成了数据观测(data observer)、属性和方法的初始化(init props、init methods、init data、init computed、init watch)。
  3. 挂载前(beforeMount):在实例被挂载到DOM之前调用,此时实例的template还没有被渲染成真实的DOM。
  4. 挂载后(mounted):在实例被挂载到DOM之后立即调用,此时实例的template已经被渲染成真实的DOM,可以对DOM进行操作。
  5. 更新前(beforeUpdate):在数据更新之前调用,此时实例的数据已经被更新,但是视图还没有被重新渲染。
  6. 更新后(updated):在数据更新之后立即调用,此时视图已经被重新渲染。
  7. 销毁前(beforeDestroy):在实例被销毁之前调用,此时实例的数据、方法、监听器都还可用。
  8. 销毁后(destroyed):在实例被销毁之后调用,此时实例的所有东西都已经被清理,无法再访问到它们。
<!--
 * @Description: 生命周期
 * @version: 1.0
 * @Author: shu
 * @Date: 2023-04-16 17:48:16
 * @LastEditors: 修改者填写
 * @LastEditTime: 2023-04-16 17:50:34
-->
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>生命周期</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>


<body>
    <div id="app">
        <div>
            <p>商品名称:{{ product.name }}</p>
            <p>商品价格:{{ product.price }}</p>
            <p>商品折扣:{{ product.discount }}</p>
            <p>商品折后价:{{ salePrice() }}</p>
            <button @click="product.discount = 0.5">打五折</button>

        </div>
    </div>
    <script>
        var app = new Vue({
            el: '#app',
            data: {
                product: {
                    name: '电视机',
                    price: 1000,
                    discount: 0.8
                }
            },
            computed: {
                salePrice() {
                    return this.product.price * this.product.discount
                }
            },
            methods: {
                salePrice() {
                    return this.product.price * this.product.discount
                }
            },
            beforeCreate() {
                console.log('beforeCreate')
            },
            created() {
                console.log('created')
            },
            beforeMount() {
                console.log('beforeMount')
            },
            mounted() {
                console.log('mounted')
            },
            beforeUpdate() {
                console.log('beforeUpdate')
            },
            updated() {
                console.log('updated')
            },
            beforeDestroy() {
                console.log('beforeDestroy')
            },
            destroyed() {
                console.log('destroyed')
            }
        })
    </script>


</html>

image.png
总结一下:
Vue生命周期钩子函数可以分为以下几类:

  1. 创建阶段:从创建Vue实例到挂载到DOM上之前的阶段。
    • beforeCreate
    • created
  2. 挂载阶段:将Vue实例挂载到DOM上的阶段。
    • beforeMount
    • mounted
  3. 更新阶段:当Vue实例的数据发生变化时,触发重新渲染视图的阶段。
    • beforeUpdate
    • updated
  4. 销毁阶段:当Vue实例被销毁时的阶段。
    • beforeDestroy
    • destroyed

下面我们来详细介绍每个钩子函数的作用和应用场景。

  1. beforeCreate

在实例被创建之初,此钩子函数会被调用。此时,Vue实例的数据和方法都还未初始化,因此无法访问data、computed、methods等选项。
这个阶段的应用场景比较少,一般用于插件开发或者扩展Vue功能。例如,可以在这个钩子函数中添加全局指令或者自定义方法。

  1. created

在实例初始化完成后,此钩子函数会被调用。此时,Vue实例的数据和方法已经被初始化,可以访问data、computed、methods等选项。
这个阶段的应用场景比较多,可以进行一些初始化操作,例如获取数据、初始化事件等。注意,在这个钩子函数中,尚未完成挂载阶段,因此无法访问到DOM。

  1. beforeMount

在Vue实例挂载到DOM上之前,此钩子函数会被调用。此时,Vue实例已经完成了模板的编译,并且将要把编译后的模板挂载到指定的DOM元素上。
这个阶段的应用场景比较少,一般用于在DOM元素挂载之前进行一些操作,例如修改数据、添加样式等。

  1. mounted

在Vue实例挂载到DOM上之后,此钩子函数会被调用。此时,Vue实例已经完成了挂载,可以访问到挂载后的DOM元素。
这个阶段的应用场景比较多,可以进行一些与DOM相关的操作,例如初始化插件、设置定时器、绑定事件等。

  1. beforeUpdate

在Vue实例数据发生变化之前,此钩子函数会被调用。此时,Vue实例的数据已经更新,但是还未重新渲染视图。
这个阶段的应用场景比较少,一般用于在数据更新之前进行一些操作,例如记录数据更新前的状态、取消更新等。

  1. updated

在Vue实例数据发生变化之后,此钩子函数会被调用。此时,Vue实例已经完成了数据更新和重新渲染视图。
这个阶段的应用场景比较多,可以进行一些与DOM相关的操作,例如更新插件、重新绑定事件等。
需要注意的是,在这个钩子函数中,如果修改了数据,会导致无限循环更新的问题,因此要避免在这个钩子函数中修改数据。

  1. beforeDestroy

在Vue实例销毁之前,此钩子函数会被调用。此时,Vue实例还未被销毁,可以访问到Vue实例的数据和方法。
这个阶段的应用场景比较少,一般用于在Vue实例被销毁之前进行一些清理操作,例如取消定时器、解绑事件等。

  1. destroyed

在Vue实例被销毁之后,此钩子函数会被调用。此时,Vue实例已经被销毁,无法访问到Vue实例的数据和方法。
这个阶段的应用场景比较少,一般用于在Vue实例被销毁之后进行一些清理操作,例如释放内存、取消引用等。

三 数据检测的原理

Vue的数据检测原理是响应式编程的一种实现方式,它通过数据劫持和发布-订阅模式来实现数据的自动更新和视图的响应式更新,具体来说,Vue的数据检测原理主要包括以下几个步骤:

  1. 数据劫持

当我们使用Vue创建一个实例时,Vue会对其数据对象进行递归地遍历,将每个属性都转换为getter和setter函数,这个过程就是数据劫持。这样,在我们访问或修改数据对象的属性时,Vue就能够捕获到这个操作,并通过getter和setter函数来实现响应式更新。

  1. 发布-订阅模式

Vue通过一个中央事件总线(即Vue实例的 e m i t 和 emit和 emiton方法)来实现发布-订阅模式。在数据对象被访问或修改时,Vue会自动触发相应的事件,并通知所有订阅了这个事件的Watcher对象。

  1. Watcher对象

Watcher对象是Vue的核心概念之一,它负责监测数据的变化并更新视图。每个Watcher对象都对应着一个DOM元素或组件实例,当Watcher对象接收到数据变化的事件时,它会重新计算虚拟DOM树并更新对应的视图。在Vue的内部实现中,Watcher对象被组织成一个树状结构,并使用依赖收集的方式来管理依赖关系,这样就能够避免不必要的DOM操作,提高渲染性能。

  1. 批处理

为了减少不必要的DOM操作,Vue使用了一些优化策略,例如异步更新队列和批处理机制。当数据发生变化时,Vue会将需要更新的Watcher对象添加到一个异步更新队列中,然后通过nextTick方法来异步执行队列中的更新操作。在执行更新操作时,Vue会尽可能地合并多个更新操作,以减少不必要的DOM操作和渲染开销。

<DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>测试</title>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
        <div id="app">
            <div>
                <p>{{ message }}</p>
                <button @click="changeMessage">Change Message</button>
            </div>
        </div>
        <script>
            var app = new Vue({
                el: '#app',
                data: {
                    message: 'Hello, Vue!'
                },
                methods: {
                    changeMessage() {
                        this.message = 'Hello, World!'
                    }
                },
            })
        </script>
  • 在这个案例中,我们有一个数据属性message和一个方法changeMessage,当用户点击按钮时,changeMessage方法会将message的值改为’Hello, World!'。
  • 这时,Vue的数据检测机制会自动检测到message的变化,并触发视图的重新渲染,从而将新的值’Hello, World!'显示在页面上。
  • 具体来说,当我们创建这个Vue实例时,Vue会对data对象中的message属性进行数据劫持,将其转换为getter和setter函数。
  • 当用户点击按钮时,changeMessage方法会修改message的值,这个操作会触发message的setter函数,并向中央事件总线(即Vue实例)发布一个数据变化的事件。
  • 此时,与message相关的Watcher对象会接收到这个事件,并将自己添加到异步更新队列中。
  • 最后,通过nextTick方法异步执行队列中的更新操作,重新计算虚拟DOM树并更新对应的视图,将新的值’Hello, World!'渲染到页面上。

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

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

相关文章

vue记住密码

<div class"checkbox-login"><input type"checkbox" id"defaults" v-model"loginForm.rememberMe" /><label class"label" for"defaults">记住密码</label></div> .checkbox-logi…

RPA的尽头是超自动化?

超自动化在经过数年的发酵期后&#xff0c;已从一个科技概念崛起为市值近千亿元的新赛道&#xff0c;包括各大互联网巨头、科技公司都纷纷围绕超自动化进行战略布局。 一方面&#xff0c;是行业巨头选择纷纷跻身超自动化新赛道&#xff0c;另一方面&#xff0c;RPA行业的领军企…

邯郸学院软件学院软件工程专业教师参加“火焰杯”软件测试颁奖典礼

近日&#xff0c;全国第三届“火焰杯”软件测试河北赛区颁奖典礼在河北工程技术学院举行。我院软件工程教研室主任张颖、教师王金如受邀参与此次颁奖典礼。王金如老师获得大赛优秀指导教师二等奖&#xff0c;软件学院荣获优秀组织单位奖。 赛事开始之际&#xff0c;学院就积极…

如何安装nvm管理node版本

如果已经有node可以先卸载&#xff08;也可以不卸载&#xff0c;安装nvm的时候会有提示&#xff0c;可以管理现有的node&#xff09; 一、在控制面板卸载程序中卸载现有的node 二、下载nvm并进行安装 nvm官网地址&#xff1a;nvm文档手册 - nvm是一个nodejs版本管理工具 - nvm…

JMH:让你的Java程序性能翻倍的神器

大家好&#xff01;今天我要向大家详细介绍JMH&#xff08;Java Microbenchmark Harness&#xff09;&#xff0c;这个被誉为Java性能测试的利器。无论你是想优化现有的Java代码还是开发新的项目&#xff0c;JMH都能够帮助你准确、可靠地测量和分析代码的性能&#xff0c;让我们…

复制交易为什么用经纪商信号?anzo capital昂首资本3点理由心服口服

为什么那么多成功的交易者喜欢复制经纪商的信号进行交易呢&#xff1f;anzo capital昂首资本认为这种模式具有以下优势&#xff1a; 首先&#xff0c;复制信号是免费的&#xff0c;投资者无需支付任何费用即可享受到信号提供商的交易策略。 其次&#xff0c;交易员的排名是透…

双指针——移动零

一&#xff0c;题目要求&#xff1a; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0…

零代码编程:用ChatGPT下载lexfridman的所有播客音频和文本

莱克斯弗里德曼&#xff08;Lex Fridman&#xff09;&#xff0c;男&#xff0c;麻省理工学院&#xff08;MIT&#xff09;研究科学家兼播客节目主持人&#xff0c;是一位俄罗斯裔美国计算机科学家。2014年&#xff0c;弗里德曼加入谷歌&#xff0c;但在6个月后离开了公司。201…

苹果电脑如何修改文件创建时间

如果您想修改 Mac 上的文件创建时间&#xff0c;可以采用几种不同的方法。您可以使用 Finder 修改文件创建时间&#xff0c;也可以使用终端修改文件创建时间。当然&#xff0c;您还可以使用第三方应用软件进行修改文件创建时间。 小编比较懒&#xff0c;不喜欢太麻烦的操作&am…

苹果手机怎么隐藏照片?(详细图文教程)

我们的手机相册中可能会保存一些与个人隐私相关的照片&#xff0c;比如&#xff1a;银行卡、身份证、护照等私人信息。这些照片如果不进行加密处理的话&#xff0c;会很容易泄露出去。 在别人使用您的手机时&#xff0c;如果您不想这些隐私照片被人看到该怎么办呢&#xff1f;…

Java基础练习(矩阵的加减乘除运算)

简介 对于有了解&#xff0c;但是了解不深的同学&#xff0c;学习Java总是感觉一看就会&#xff0c;一些就废。往往需要一些实操练习&#xff0c;来夯实我们的学习结果。九九乘法表和计算器都是在编程学习领域比较经典的案例。本文为大家讲解一下两个基础实操&#xff0c;熟悉一…

在线JSON转EXCEL工具

全天下的柔情共十分&#xff0c;你占八分。你喊我名字那晚的凉风秋月算一分&#xff0c;其余所有占一分。 推荐 在线JSON转Excel工具 - WeJSON 工具简介 在线JSON转Excel工具&#xff0c;可以快速将JSON数组数据一键转换为Excel格式&#xff0c;方便数据的可视化和交流。 所…

基于Qt设计的邮件收发管理系统(垃圾邮件识别)

基于Qt设计的邮件收发管理系统(垃圾邮件识别) 一、项目背景 随着互联网的发展,邮件成为人们沟通交流不可或缺的一部分。然而,随之而来的是大量的垃圾邮件和欺诈邮件,给人们的生活造成了很大的困扰和威胁。为了解决这个问题,本文提出了一种基于Qt设计的朴素贝叶斯算法邮件收…

SSL证书品牌 Positive

Positive品牌的SSL证书具有以下优势&#xff1a; 1. 安全性&#xff1a;Positive SSL证书提供强大的加密算法&#xff0c;确保通过网站传输的数据得到保护&#xff0c;防止被未经授权的第三方窃取或篡改。 2. 可信度&#xff1a;Positive SSL证书由全球知名的认证机构颁发&am…

AIGC|一文揭秘如何利用MYSCALE实现高效图像搜索?

图像搜索已成为一种流行且功能强大的能力&#xff0c;使用户能够通过匹配功能或视觉内容来查找相似的图像。随着计算机视觉和深度学习的快速发展&#xff0c;这种能力得到了极大的增强。 本文主要介绍如何基于矢量数据库MYSCALE来实现图像搜索功能。 一、MySCALE简介 MyScale 是…

win10下yolov6 tensorrt模型部署

TensorRT系列之 Win10下yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov7 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov6 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov5 tensorrt模型加速部署…

uniapp\ taro 如何使用 UnoCSS 原子化css

unocss-preset-weapp 相较于 tailwindcss 和 windicss, unocss的性能和可扩展性都优于它们 UnoCSS小程序预设 unocss-preset-weapp 内置 transformer 用于兼容小程序 transformerClass 转换转义类名&#xff0c;解决小程序不支持\\&#xff0c;\:&#xff0c;\[&#xff0c;…

瞬态抑制二极管TVS的工作原理?|深圳比创达电子EMC(下)

TVS二极管与Zener二极管同样作为过压保护&#xff0c; TVS着重浪涌电压的钳位保护&#xff0c;具有抗大电流冲击的能力;Zener管着重于稳压效果&#xff0c;具有浪涌电流小&#xff0c;保护电压稳的特点&#xff0c;两者在原理与保护特性有所区别&#xff0c;同时在个别应用领域…

回收站删除的文件怎么恢复?快来学习这3个方法!

“有时候我会先将一些不重要的文件放入回收站中&#xff0c;等需要用到时再将它还原。但是我刚刚不小心把回收站清空了&#xff0c;还有方法可以帮我找回我的数据吗&#xff1f;” 在使用电脑时&#xff0c;如果我们删除文件&#xff0c;这些文件会被先收入回收站中。如果我们是…

MODBUS-TCP转MODBUS-RTU通信应用(S7-1200和串口服务器通信)

在学习本博客之前,大家需要熟悉MODBUS-TCP和MODBUS-RTU通信,这2个通信的编程应用,大家可以查看下面文章链接: MODBUS-RTU通信 MODBUS-RTU通信协议功能码+数据帧解读(博途PLC梯形图代码)-CSDN博客MODBUS通信详细代码编写,请查看下面相关链接,这篇博客主要和大家介绍MODB…