【Vue】Vue指令与生命周期以及组件化编码

news2025/1/18 9:03:24

目录

  • 常用内置指令
    • v-text与v-html
      • v-text : 更新元素的 textContent
      • v-html : 更新元素的 innerHTML
      • 注意:v-html有安全性问题!!!!
    • v-once与v-pre
      • v-once
      • v-pre
    • ref与v-cloak
      • ref
      • v-cloak
  • 自定义指令
    • 案例
    • 定义语法
    • 配置对象中常用的3个回调
    • 备注
    • 使用指令
      • 代码解释
      • 全局指令写法
    • 回调函数(钩子函数)
  • Vue生命周期
    • 初始化显示
    • 更新状态
    • 销毁 vue 实例: vm.$destory()
    • 总结起来:
    • 生命周期的应用场景
  • VUE组件化编程
    • 模块:
    • 组件:
    • 总结
    • 非单文件组件
      • 创建组件:
      • 注册组件:
      • 使用组件(写组件标签)
    • 代码示例
    • 注意事项
      • 关于组件名:
        • 一个单词组成:
        • 多个单词组成:
      • 备注:
      • 关于组件标签:
      • 组件嵌套
    • 非单文件组件小结
    • 单文件组件
        • 模板页:
        • JS 模块对象:
        • 样式:
      • 问题
      • 解决

常用内置指令

内置指令说明
v-text更新元素的 textContent
v-html更新元素的 innerHTML
v-if如果为true, 当前标签才会输出到页面
v-else如果为false, 当前标签才会输出到页面
v-show通过控制display样式来控制显示/隐藏
v-for遍历数组/对象
v-on绑定事件监听, 一般简写为@
v-bind强制绑定解析表达式, 可以省略v-bind
v-model双向数据绑定

v-text与v-html

v-text : 更新元素的 textContent

  • 作用:向其所在的节点中渲染文本内容。
  • 与插值语法的区别:v-text会替换掉节点中的内容,{{xx}}则不会。

v-html : 更新元素的 innerHTML

  • 作用:向指定节点中渲染包含html结构的内容。
  • 与插值语法的区别:
    • v-html会替换掉节点中所有的内容,{{xx}}则不会。
    • v-html可以识别html结构。

注意:v-html有安全性问题!!!!

  • 在网站上动态渲染任意HTML是非常危险的,容易导致XSS攻击。
  • 一定要在可信的内容上使用v-html,永不要用在用户提交的内容上!
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Vue初体验</title>
    <!-- 1.引入Vue -->
    <script src="../js/vue.js"></script>
</head>
<body>
  <!-- 2.准备一个容器 -->
  <div id="root">
      <div>你好,{{name}}</div>
      <div v-text="name">HELLO,</div>
      <div v-text="ele"></div>
      <div v-html="ele"></div>
  </div>
  <script>
    //3.创建Vue实例
    const vm = new Vue({
        el:'#root',
        data:{
            name:'Vue',
            ele: '<a href="https://www.baidu.com">百度</a>'
        }
    });
  </script>
</body>
</html>

v-once与v-pre

v-once

  • v-once所在节点在初次动态渲染后,就视为静态内容了。
  • 以后数据的改变不会引起v-once所在结构的更新,可以用于优化性能。

v-pre

  • 跳过其所在节点的编译过程。(vue 不去解析 插值等语法)
  • 可利用它跳过:没有使用指令语法、没有使用插值语法的节点,会加快编译。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Vue初体验</title>
    <!-- 1.引入Vue -->
    <script src="../js/vue.js"></script>
</head>
<body>
  <!-- 2.准备一个容器 -->
  <div id="root">
      <div v-once>v-once,{{n}}</div>
      <div v-pre>v-pre,{{n}}</div>
      <div>当前n的值是:{{n}}</div>
      <button @click="n++">n+1</button>
  </div>
  <script>
    //3.创建Vue实例
    const vm = new Vue({
        el:'#root',
        data:{
            n:1
        },
    });
  </script>
</body>
</html>

ref与v-cloak

ref

  • 为某个元素注册一个唯一标识, vue对象通过$refs属性访问这个元素对象。

v-cloak

  • 使用它防止闪现表达式, 与css配合: [v-cloak] { display: none }
    • 本质是一个特殊属性,Vue实例创建完毕并接管容器后,会删掉v-cloak属性。
    • 使用css配合v-cloak可以解决网速慢时页面展示出{{xxx}}的问题。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Vue初体验</title>
    <!-- 1.引入Vue -->
    <script src="../js/vue.js"></script>
    <style>
        [v-cloak]{
            display: none;
            color: red;
            border: 3px solid green
        }
    </style>
</head>
<body>
  <!-- 2.准备一个容器 -->
  <div id="root">
      <p ref="content"><a href="">baidu.com</a></p>
      <button @click="hint">点击</button>
      <p v-cloak>{{msg}}</p>
      <h2 v-cloak>{{name}}</h2>
  </div>
  <script>
    //3.创建Vue实例
    const vm = new Vue({
        el:'#root',
        data:{
            msg:'消息',
            name:'Vue'
        },
        methods:{
            hint(){
                console.log(this.$refs.content.innerHTML);
                console.log(this.$refs.content.textContent);
            }
        }
    });
  </script>
</body>
</html>

自定义指令

案例

  • 需求1:定义一个v-big指令,和v-text功能类似,但会把绑定的数值放大10倍。
  • 需求2:定义一个v-fbind指令,和v-bind功能类似,但可以让其所绑定的input元素默认获取焦点。

定义语法

  • 局部指令(new Vue({xx})):xx为directives:{指令名:配置对象}或directives{指令名:回调函数}
  • 全局指令:Vue.directive(指令名,配置对象)或Vue.directive(指令名,回调函数)

配置对象中常用的3个回调

  • bind:指令与元素成功绑定时调用。
  • inserted:指令所在元素被插入页面时调用。
  • update:指令所在模板结构被重新解析时调用。

备注

  • 指令定义时不加v-,但使用时要加v-;
  • 指令名如果是多个单词,要使用kebab-case命名方式,不要用camelCase命名。

使用指令

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Vue初体验</title>
    <!-- 1.引入Vue -->
    <script src="../js/vue.js"></script>
</head>
<body>
  <!-- 2.准备一个容器 -->
  <div id="root">
      <h1>当前n的值是:<span v-text="n"></span></h1>
      <h1>放大10倍后的n的值是:<span v-big="n"></span></h1>
      <button @click="n++">点击n+1</button>
      <hr>
      <input type="text" v-fbind:value="n">
  </div>
  <script>
    //3.创建Vue实例
    const vm = new Vue({
        el:'#root',
        data:{
            n:10,
        },
        directives:{
            big(el,binding){
                el.innerText = binding.value * 10;
            },
            fbind:{
                bind(el,binding){
                    el.value = binding.value;
                },
                // 指令的定义
                inserted(el,binding){
                    el.focus();
                },
                update(el,binding){
                    el.value = binding.value;
                    el.focus();
                }
            }
        },
    });
  </script>
</body>
</html>

代码解释

        directives:{
        	//指令名如果是多个单词,别忘了加"",方法内部放的是"key,value值",
        	//大部分情况""可省略,但是加了-之后引号必须带
        	//全写是'big-number':function(element,binding){}
        	//函数写法
        	//big函数何时会被调用?1.指令与元素成功绑定时(一上来就是),
        	//2.指令所在的模板被重新解析时
            big(el,binding){//两个参数 当前DOM元素(span),本次绑定的所有信息
            	console.log('big',this)//注意这里的this是window
                el.innerText = binding.value * 10;
            },
            //对象写法
            fbind:{
            	//指令与元素成功绑定时调用
                bind(el,binding){
                    el.value = binding.value;
                },
                // 指令在元素插入页面时调用
                inserted(el,binding){
                    el.focus();//input输入框自动获取焦点,这句代码必须放在将input放入页面的后面
                },
                //指令所在的模板重新定义时调用
                update(el,binding){
                    el.value = binding.value;
                    el.focus();
                }
            }
        },

全局指令写法

    Vue.directives('fbind',{
        bind(el,binding){
            el.value = binding.value;
        },
        // 指令的定义
        inserted(el,binding){
            el.focus();
        },
        update(el,binding){
            el.value = binding.value;
            el.focus();
        }
    })
    Vue.directives('big',function (el,binding) {
        el.innerText = binding.value * 10;
    })

回调函数(钩子函数)

  • el:指令所绑定的元素,可以用来直接操作 DOM
  • binding:一个对象,包含以下 property:
    • name:指令名,不包括 v- 前缀。
    • value:指令的绑定值,例如:v-my-directive=“1 + 1” 中,绑定值为 2。
    • oldValue:指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
    • expression:字符串形式的指令表达式。例如 v-my-directive=“1 + 1” 中,表达式为 “1 + 1”。
    • arg:传给指令的参数,可选。例如 v-my-directive:foo 中,参数为 “foo”。
    • modifiers:一个包含修饰符的对象。例如:v-my-directive.foo.bar 中,修饰符对象为 { foo: true, bar: true }
    • vnode:Vue 编译生成的虚拟节点
    • oldVnode:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Vue初体验</title>
  <!-- 1.引入Vue -->
  <script src="../js/vue.js"></script>
</head>
<body>
<!-- 2.准备一个容器 -->
<div id="root" v-demo:foo.a.b="name"></div>
<hr>
<div id="root2" v-demo:foo.a.b.c="1+1"></div>
<script>
  Vue.directive('demo',{
    bind:function (el,binding,vnode) {
      var s = JSON.stringify
      el.innerHTML =
        'name: ' + s(binding.name) + '<br>' +
        'value: ' + s(binding.value) + '<br>' +
        'expression: ' + s(binding.expression) + '<br>' +
        'argument: ' + s(binding.arg) + '<br>' +
        'modifiers: ' + s(binding.modifiers) + '<br>'
    }
  })
  //3.创建Vue实例
  const vm = new Vue({
    el:'#root',
    data:{
      name:'Vue',
    },
  });
  const vm2 = new Vue({
    el:'#root2',
    data:{
    },
  });
</script>
</body>
</html>

在这里插入图片描述

Vue生命周期

  • 又名:生命周期回调函数、生命周期函数、生命周期钩子。
  • 是什么:Vue在关键时刻帮我们调用的一些特殊名称的函数。
  • 生命周期函数的名字不可更改,但函数的具体内容是程序员根据需求编写的。
  • 生命周期函数中的this指向是vm 或 组件实例对象(vue内部做了处理)

初始化显示

beforeCreate()、created()、beforeMount()、mounted()

更新状态

beforeUpdate()、updated()

销毁 vue 实例: vm.$destory()

beforeDestory()、destoryed()

在这里插入图片描述

总结起来:

  1. 创建前阶段(beforeCreate): 实例刚在内存中被创建出来,此时还未进行数据初始化和事件的监听。
  2. 创建阶段(created): 实例已经在内存中创建完毕,完成了数据初始化,但尚未挂载到页面上。
  3. 挂载前阶段(beforeMount): 实例将要挂载到页面上,此时 render 函数首次被调用。
  4. 挂载阶段(mounted): 实例已经挂载到页面,此时页面上的 DOM 元素可以被访问。
  5. 更新前阶段(beforeUpdate): 当数据发生变化时,虚拟 DOM 将被重新渲染,但尚未更新到页面上。
  6. 更新阶段(updated): 数据已经更新到页面上,此时页面上的 DOM 元素也得到了更新。
  7. 销毁前阶段(beforeDestroy): 实例将要被销毁,此时可以进行一些清理工作,如取消定时器、解绑事件等。
  8. 销毁阶段(destroyed): 实例已经被销毁,所有的事件监听器都已经被移除,所有的子实例也都被销毁。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Vue初体验</title>
    <!-- 1.引入Vue -->
    <script src="../js/vue.js"></script>
</head>
<body>
  <!-- 2.准备一个容器 -->
  <div id="root">
      <h1>{{name}}</h1>
      <button @click="changeName">点击更换内容</button>
  </div>
  <script>
    //3.创建Vue实例
    const vm = new Vue({
        el: '#root',
        data: {
            name: 'Hello Vue',
        },
        beforeCreate() {
            console.log('beforeCreate: 实例创建前的钩子函数');
        },
        created() {
            console.log('created: 实例创建完毕,数据初始化完成');
        },
        beforeMount() {
            console.log('beforeMount: 实例将要挂载到页面上');
        },
        mounted() {
            console.log('mounted: 实例已经挂载到页面上');
        },
        beforeUpdate() {
            console.log('beforeUpdate: 数据将要更新,虚拟 DOM 重新渲染前');
        },
        updated() {
            console.log('updated: 数据已经更新,页面上的 DOM 元素也已更新');
        },
        beforeDestroy() {
            console.log('beforeDestroy: 实例将要被销毁');
        },
        destroyed() {
            console.log('destroyed: 实例已经被销毁');
        },
        methods: {
            changeName() {
                this.name = 'Hello World!!!';
            }
        }
    })
  </script>
</body>
</html>

生命周期的应用场景

钩子描述
created 钩子在这个阶段,可以进行数据初始化、异步请求、事件监听等操作。通常用于初始化组件所需的数据。
mounted 钩子在组件挂载后执行,适合执行需要访问DOM元素的操作,如使用第三方库对页面进行操作。
beforeUpdate 钩子在数据更新但尚未更新到页面上时执行,可以用于获取更新前的DOM状态,或执行一些更新前的准备工作。
updated 钩子在数据更新且更新到页面上后执行,适合执行需要操作更新后的DOM的任务。
beforeDestroy 钩子在组件销毁前执行,可以用于清理定时器、解绑事件等清理工作。
destroyed 钩子在组件销毁后执行,适合执行一些需要在组件销毁后进行的清理工作。

VUE组件化编程

  • 组件定义:实现应用中局部功能代码和资源的集合

模块:

  • 理解:向外提供特定功能的js程序,一般就是一个js文件
  • 为什么:js文件很多很复杂
  • 作用:复用js,简化js的编写,提高js运行效率。
    在这里插入图片描述

组件:

  • 理解:用来实现局部(特定)功能效果的代码集合(html/css/js/image……)
  • 为什么:一个界面的功能很复杂
  • 作用:复用编码,简化项目编码,提高运行效率
    在这里插入图片描述

总结

  • 模块化:当应用中的js都以模块来编写的,那这个应用就是一个模块化的应用。
  • 组件化:当应用中的功能都是多组件的方式来编写的,那这个应用就是一个组件化的应用。
    在这里插入图片描述

非单文件组件

使用组件的三大步骤

创建组件:

使用Vue.extend(options)创建,其中 options和 new Vue(options)时传入的那个 options几乎一样,但有以下区别

  • 不要写 el——最终所有的组件都要经过一个vm的管理,由vm中的 el决定服务哪个容器
  • data必须写成函数——避免组件被复用时,数据存在引用关系
    • 引申出data为什么需要是一个函数(利用一个最基本的函数调用销毁原理返回新对象)
  • 【备注】使用 tempalte可以配置组件结构

注册组件:

  • 局部创建:new Vue的时候传入 components选项
  • 全局创建:Vue.component(‘组件名’, 组件)

使用组件(写组件标签)

代码示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Vue初体验</title>
    <!-- 1.引入Vue -->
    <script src="../js/vue.js"></script>
</head>
<body>
  <!-- 2.准备一个容器 -->
  <div id="root">
      <h1>{{name}}</h1>
      <hr>
      <!-- 第三步:使用模板 -->
      <School></School>
      <!--<hr>
      <Student></Student>-->
  </div>
  <script>
      //第一步:创建模板
      const School = Vue.extend({
          template: `
            <div>
                <h1>学校名称:{{schoolName}}</h1>
                <h1>学校地址:{{schoolAddress}}</h1>
                <button @click="showName">点击显示学校名称</button>
            </div>
        `,
          //el:'root',//组件定义时不支持el属性,因为最终所有的组件都要被一个vm管理,由vm决定服务于哪个容器
          data(){
              return {
                  schoolName:'复旦大学',
                  schoolAddress:'上海'
              }
          },
          methods: {
              showName() {
                  alert(this.schoolName)
              }
          }
      })
      //Vue.component("School",School) // 全局注册
    //3.创建Vue实例
    const vm = new Vue({
        el: '#root',
        components: {//局部注册,第二步:注册模板
            School
        },
        data(){
            return{
                name: 'Hello Vue',
            }
        },
        methods: {
            showName() {
                alert(this.schoolName)
            }
        }
    })
  </script>
</body>
</html>

注意事项

关于组件名:

一个单词组成:
  • 第一种写法(首字母小写): school
  • 第二种写法(首字母大写): School
多个单词组成:
  • 第一种写法(kebab-case命名): my-school
  • 第二种写法(CamelCase命名): MySchool(需要Vue脚手架支持)

备注:

  1. 组件名尽可能回避HTML中已有的元素名称,例如h2、H2
  2. 可以使用 name配置项指定组件在开发者工具中呈现的名字(写标签名的时候还得按注册的写法)

关于组件标签:

  • 第一种写法:
  • 第二种写法: (不使用脚手架会导致后续组件不能渲染)
  • 简写方式:const school = Vue.extend(options) 可以简写成 const school = options

组件嵌套

  • 极尽可能的复用代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Vue初体验</title>
    <!-- 1.引入Vue -->
    <script src="../js/vue.js"></script>
</head>
<body>
  <!-- 2.准备一个容器 -->
  <div id="root">
      <h1>{{name}}</h1>
      <hr>
      <!-- 第三步:使用模板 -->
      <School></School>
      <hr>
      <Student></Student>
  </div>
  <script>
      const Student = Vue.extend({
          template: `
            <div>
                <h1>学校名称:{{studentName}}</h1>
                <h1>学校地址:{{studentAge}}</h1>
                <button @click="showStudentName">点击显示学生名称</button>
            </div>
        `,
          data(){
              return {
                  studentName:'朱家宝',
                  studentAge:18
              }
          },
          methods: {
              showStudentName() {
                  alert(this.studentName)
              }
          }
      })
      //第一步:创建模板
      const School = Vue.extend({
          template: `
            <div>
                <h1>学校名称:{{schoolName}}</h1>
                <h1>学校地址:{{schoolAddress}}</h1>
                <button @click="showName">点击显示学校名称</button>
                <div style="border: 1px solid red;width: 50%">
                  <Student></Student>
                </div>
            </div>
        `,
          components: {//局部注册,第二步:注册模板
              Student
          },
          data(){
              return {
                  schoolName:'复旦大学',
                  schoolAddress:'上海'
              }
          },
          methods: {
              showName() {
                  alert(this.schoolName)
              }
          }
      })
    //3.创建Vue实例
    const vm = new Vue({
        el: '#root',
        components: {//局部注册,第二步:注册模板
          School,Student
        },
        data(){
            return{
                name: 'Hello Vue',
            }
        }
    })
  </script>
</body>
</html>

非单文件组件小结

  1. 模板编写没有提示
  2. 没有构建过程, 无法将 ES6 转换成 ES5
  3. 不支持组件的 CSS
  4. 真正开发中几乎不用:

单文件组件

单文件组件 vue 文件的组成(3 个部分)

模板页:
<template>
页面模板
</template>
JS 模块对象:
<script>
export default{...}
</script>
样式:
<style>
样式定义
</style>

在这里插入图片描述

问题

在这里插入图片描述

解决

  • Vue脚手架

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

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

相关文章

一键批量合并视频:掌握视频剪辑技巧解析,轻松创作完美影片

在数字时代的浪潮下&#xff0c;视频已成为人们记录和分享生活的重要工具。然而&#xff0c;对于许多非专业视频编辑者来说&#xff0c;将多个视频片段合并成一个完整的影片却是一项复杂且耗时的任务。幸运的是&#xff0c;云炫AI智剪一键批量合并视频功能的出现&#xff0c;让…

QT切换控件布局

1、切换前垂直布局 2、切换后水平布局 3、关键代码 qDebug() << "开始切换布局";QWidget *widget centralWidget();QLayout *layout widget->layout();if(layout){while(layout->count()){QLayoutItem *item layout->takeAt(0);if(item->layout…

自动化神器Autolt,让你不再重复工作!

随着互联网不断发展&#xff0c;它给我们带来便利的同时&#xff0c;也带来了枯燥、重复、机械的重复工作。今天&#xff0c;我要和大家分享一款老牌实用的自动化工具&#xff1a;AutoIt&#xff0c;它能够让你告别繁琐的重复性工作&#xff0c;提高工作效率。 这里透露一下&am…

C++中的complex

在 C 中&#xff0c;std::complex 是一个模板类&#xff0c;用于表示和操作复数。这个类是标准模板库&#xff08;STL&#xff09;的一部分&#xff0c;包含在 头文件中。std::complex 提供了一套丰富的功能&#xff0c;包括基本的算术运算、比较运算、数学函数等&#xff0c;使…

大语言模型LLM原理篇

大模型席卷全球&#xff0c;彷佛得模型者得天下。对于IT行业来说&#xff0c;以后可能没有各种软件了&#xff0c;只有各种各样的智体&#xff08;Agent&#xff09;调用各种各样的API。在这种大势下&#xff0c;笔者也阅读了很多大模型相关的资料&#xff0c;和很多新手一样&a…

苹果 iPhone 15 Pro Max 称霸:智能手机市场势不可挡

苹果 iPhone 15 Pro Max 称霸&#xff1a;智能手机市场势不可挡 概述 在拥挤且竞争激烈的智能手机市场中&#xff0c;苹果的 iPhone 15 Pro Max 成为明显的赢家&#xff0c;在 2024 年第一季度最畅销智能手机排行榜上名列前茅。根据 Counterpoint Research 的数据&#xff0c…

css: 动态设置网格线

参考这个博客做了网格线&#xff1a; http://t.csdnimg.cn/y20vM 把网格颜色&#xff0c;宽高和透明度做成可配置项。 <e-collapse title"网格线" :expand"false"><t-form-item label"颜色"><el-color-picker v-model"fo…

vue2+Ts中openLayer绘图工具组件封装

vue2Ts中openLayer绘图工具组件封装 效果&#xff1a; 封装组件代码&#xff1a; <!-- openLayer绘图工具 --> <template><a-button-group v-show"isShow"><a-button v-if"shouldShowButton(point)" click"draw(Point)"…

Axure10_win安装教程(安装、汉化、授权码,去弹窗)

1.下载Axure10 链接&#xff1a;https://pan.baidu.com/s/1fc8Bgyic8Ct__1IOv-afUg 提取码&#xff1a;9qew 2.安装Axure10 因为我的电脑是Windows操作系统&#xff0c;所以我下载的AxureRP-Setup-Beta v10.0.0.3816 (Win).exe 一直点下一步就行 3.Axure10中文 打开Axure…

(python)cryptography-安全的加密

前言 cryptography 是一个广泛使用的 Python 加密库&#xff0c;提供了各种加密、哈希和签名算法的实现。它支持多种加密算法&#xff0c;如 AES、RSA、ECC 等&#xff0c;以及哈希函数&#xff08;如 SHA-256、SHA-384 等&#xff09;和数字签名算法(如 DSA、ECDSA 等). 目录 …

Linux下Code_Aster源码编译安装及使用

目录 软件介绍 基本依赖 其它依赖 一、源码下载 二、解压缩 三、编译安装 四、算例运行 软件介绍 Code_aster为法国电力集团&#xff08;EDF&#xff09;自1989年起开始研发的通用结构和热力耦合有限元仿真软件。Code_aster可用于力学、热学和声学等物理现象的仿真分析&…

诺基亚3210复古风再起:情怀与现实的碰撞

在数字科技日新月异的今天&#xff0c;诺基亚的复古风潮却意外地掀起了波澜。这款曾经风靡一时的诺基亚3210&#xff0c;在时隔二十五年后&#xff0c;以全新的面貌再次回归市场&#xff0c;引发了无数人的怀旧与好奇。 诺基亚的这次“千禧回归”策略&#xff0c;无疑是对Y2K潮…

Java——类和对象第二节——封装

1.什么是封装 封装是面向对象程序的三大特性之一&#xff0c;面向对象程序的三大特性分别是封装&#xff0c;继承&#xff0c;多态 而封装简单来说就是套壳隐藏细节 打个比方&#xff1a; 在一些电脑厂商生产电脑时&#xff0c;仅对用户提供开关机键&#xff0c;键盘输入&a…

鸿蒙布局Column/Row/Stack

鸿蒙布局Column/Row/Stack 简介我们以Column为例进行讲解1. Column({space: 10}) 这里的space: 10&#xff0c;表示Column里面每个元素之间的间距为102. width(100%)&#xff0c;height(100%) 表示宽高占比3. backgroundColor(0xffeeeeee) 设置背景颜色4. padding({top: 50}) 设…

基于Springboot+Vue的Java项目-农产品直卖平台系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

【docker】SpringBoot应用容器镜像日志挂载

启动镜像时候使用 -v 挂载 首先得在宿主机创建目录&#xff1a;/workspace/java/demo/logs mkdir -pv /workspace/java/demo/logs 启动镜像 docker run -p 8080:8080 -itd -v /workspace/java/demo/logs/:/logs/ 192.168.2.1:5000/demo:0.0.1-SNAPSHOT -v /workspace/ja…

VMware虚拟机没有网,无法设置网络为桥接状态

今天需要使用Ubuntu18但现有虚拟机是Ubuntu20&#xff0c;由于硬盘空间不够大&#xff0c;所以删除了原来的虚拟机并重新搭建Ubuntu18的环境&#xff0c;然后发现虚拟机没有网络&#xff0c;而我之前的虚拟机这一切都是正常的。 在网络设置里勾选的是桥接模式但无法联网&#x…

如何基于可靠事件模式实现最终一致性?

今天我们一起来探讨一个分布式环境下的常见问题,这个问题与数据的一致性有关。那么,什么是数据一致性呢?要回答这个问题,需要我们回顾一下单块系统和分布式系统中对于数据处理的不同需求。 我们知道,传统的单块系统通常都只与一个数据库进行交互,所有的数据处理过程都位于…

前端连续发送同一个请求时,终止上一次请求

场景&#xff1a;几个tab页之间快速的切换&#xff08;tab页只是参数不同&#xff0c;下边的数据渲染给同一个data&#xff09;就会导致如果我在1,2,3&#xff0c;tab页按照顺序快速点击&#xff0c;发送三个请求&#xff0c;我想要展示的是3但是如果1或者2请求响应的时间比3长…

广汽原车控制系统CAN协议控制汽车基本信息获取及数据应用

在现代汽车工业的迅速发展中&#xff0c;车辆控制系统的智能化和网络化已成为提升汽车性能的关键。广汽作为中国汽车行业的佼佼者&#xff0c;其在原车通信网络方面也取得了显著的成就。特别是广汽原车CAN&#xff08;Controller Area Network&#xff09;协议的应用&#xff0…