Vue3.0(一):Vue的引入-options api-模板语法

news2024/9/29 17:22:50

Vue的引入方式

CDN方式进行引入

  • 将以下 script标签引入即可
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <!-- CDN地址 -->
    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
  </head>
  <body>
    <div id="app"></div>
    <script>
      //使用Vue
      const app = Vue.createApp({
        template: `<h1>hello</h1>`,
      });
      //挂载
      app.mount("#app");
    </script>
  </body>
</html>

本地引入

  • 可以将CDN中地址中的代码,拷贝到一个 vue.js文件中
  • 之后引入该js文件即可
  <script src="./vue.js"></script>

命令式编程和声明式编程的区别

image.png

  • 以上案例是实现了一个计数器的功能
    • 左边是Vue实现
    • 右边是原生实现
  • 原生js实现—命令式编程
    • 需要将每一步操作,都转化为代码,告诉计算机要怎么实现
    • 相当于每一步操作都告诉计算机执行什么命令
  • Vue实现—声明式编程
    • 在vue实现中,只需要声明要展示什么数据,展示的具体内容,以及用到的方法
    • 而Vue内部会将这些内容进行关联
  • 命令式编程how to do,自己完成整个how的过程
  • 声明式编程what to do,由框架完成 how的过程

MVVM模型

Model-View-ViewMode的简称

  • Vue不完全遵循MVVM模型,但是受到了启发

image.png

  • View相当于html代码,Model是声明变量,方法;ViewModel就是Vue框架
  • Vue框架会将数据与View进行绑定,当View发生了点击等事件,会交由Vue处理,找到对应的Model中的方法

options api(部分)

data属性

//使用Vue
const app = Vue.createApp({
    data(){
        return{
            title:"Vue3.0"
        }
    }
});
//挂载
app.mount("#app");
  • data属性是传入一个函数,并返回一个对象
  • data中返回的对象,会被Vue的响应式系统劫持(通过 Proxy方式实现)

methods属性

//使用Vue
const app = Vue.createApp({
    methods:{
        myClick(){
            //可以通过this访问data中声明的变量
            console.log(123)
        }
    }
});
//挂载
app.mount("#app");
  • methods中通常是用于声明函数方法的
  • 声明函数的时候,不能使用箭头函数
    • 因为使用了箭头函数,会找到上一层作用域中的this,导致无法访问到data中的变量

computed计算属性

有些数据需要进行处理之后,再将其显示到页面中

  • 对于响应式数据的复杂逻辑,都应该使用计算属性
    • 在computed中可以使用this访问data中的变量
<div id="app">
    <div>{{numStr}}</div>
</div>
<script>
    //使用Vue
    const app = Vue.createApp({
        data() {
            return {
                arr: [1, 2, 3],
            };
        },
        computed: {
            //计算属性的值都是函数
            numStr() {
                return this.arr.join("");
            },
        },
    });
    //挂载
    app.mount("#app");
</script>
  • 计算属性是有缓存的
    • 因为计算属性会基于它的依赖关系进行缓存(上面的例子中,numStr计算属性的依赖关系就是arr)
    • 当依赖关系不发生变化的时候,计算属性是不需要重新计算的(arr不变,则numStr不重新计算)
    • arr发生了变化,则numStr会重新进行计算

watch侦听器

用于侦听数据的变化,当数据发生变化的时候,需要执行特定的逻辑

<div id="app">
    <div v-for="(item,index) in arr" :key="index">{{item}}</div>
    <button @click="arrChange">change</button>
</div>
<script>
    //使用Vue
    const app = Vue.createApp({
        data() {
            return {
                arr: [1, 2, 3],
            };
        },
        watch: {
            //监听的变量
            //传入两个参数,newValue和oldValue
            arr(newValue, oldValue) {
                //对于对象的侦听,newValue, oldValue实际上是Proxy对象
                console.log(newValue, oldValue);
                //若想获取Proxy的原始数据,可以使用Vue.toRaw
                console.log(Vue.toRaw(newValue));
            },
        },
        methods: {
            arrChange() {
                this.arr = [1, 2, 3, 4];
            },
        },
    });
    //挂载
    app.mount("#app");

侦听器的配置选项

修改对象的某个属性,需要进行特殊的配置,才可以侦听到,需要进行深度侦听

<div id="app">
    <div v-for="(item,index) in arr" :key="index">{{item}}</div>
    <button @click="arrChange">change</button>
</div>
<script>
    //使用Vue
    const app = Vue.createApp({
        data() {
            return {
                arr: [1, 2, 3],
            };
        },
        //进行监听
        watch: {
            arr: {
                handler(newValue, oldValue) {
                    //此时你会发现,newValue和oldValue是一样的
                    //这是因为内存地址没有发生过变化,所以是一样的
                    console.log(newValue, oldValue);
                },
                //开启深度侦听
                deep: true,
            },
        },
        methods: {
            arrChange() {
                this.arr.push(4);
            },
        },
    });
    //挂载
    app.mount("#app");
</script>

第一次渲染的时候,默认是不会进行侦听的,可以通过immediate进行配置

<div id="app">
    <div v-for="(item,index) in arr" :key="index">{{item}}</div>
    <button @click="arrChange">change</button>
</div>
<script>
    //使用Vue
    const app = Vue.createApp({
        data() {
            return {
                arr: [1, 2, 3],
            };
        },
        watch: {
            arr: {
                handler(newValue, oldValue) {
                    //此时你会发现,newValue和oldValue是一样的
                    //这是因为内存地址没有发生过变化,所以是一样的
                    console.log(newValue, oldValue);
                },
                //开启深度侦听
                deep: true,
                //首次加载是否侦听
                immediate: true,
            },
        },
        methods: {
            arrChange() {
                this.arr.push(4);
            },
        },
    });
    //挂载
    app.mount("#app");
</script>

v-model双向数据绑定

  • v-model指令可以在表单input textarea等元素上创建双向数据绑定
  • 它会根据控件类型自动选取正确的方式来更新元素
  • v-model本质上就是语法糖,负责监听用户的输入事件来更新数据
<div id="app">
    <!-- 手动实现 -->
    <input type="text" :value="message" @input="inputChange" />
    <h2>{{message}}</h2>
</div>
<script>
    //使用Vue
    const app = Vue.createApp({
        data() {
            return {
                message: "123",
            };
        },
        methods: {
            inputChange(event) {
                this.message = event.target.value;
            },
        },
    });
    //挂载
    app.mount("#app");
</script>
  • 通过 v-bind指令绑定message,当用户在输入框中输入内容,会触发 inputChange事件,从而将this.message进行更改
<div id="app">
    <!-- 通过v-model实现 -->
    <input type="text" v-model="message" />
    <h2>{{message}}</h2>
</div>
<script>
    //使用Vue
    const app = Vue.createApp({
        data() {
            return {
                message: "123",
            };
        },
    });
    //挂载
    app.mount("#app");
</script>

修饰符

  • lazy:v-model默认触发的是input事件,而该修饰符是将input事件转成change事件,只有当光标离开才会触发
 <input type="text" v-model.lazy="message" />
  • number:默认是字符串类型,该修饰符是将内容自动转成数字
 <input type="text" v-model.number="num" />
  • trim:去除首尾的空格
 <input type="text" v-model.trim="message" />

模板语法

Vue中特定的语法

Mustache双括号语法

<div id="app">
    <!--基本用法:可以使用data属性中返回的变量-->
	{{title}}
     <!--表达式-->
    {{counter * 2}}
     <!--三元运算符-->
    {{flag?true:false}}
     <!--可以调用methods中的函数-->
    {{myClick()}}
</div>

v-once指令(了解)

只会渲染一次

<div id="app">
   <div v-once>{{message}}</div>
</div>
  • div标签只会渲染一次,即使message被改变了,也不会重新渲染
  • 可以用于性能优化
  • 同时使用了v-once指令的元素,其子元素也只会渲染一次

v-text指令(了解)

用于更新元素的textContent

<div id="app">
   <div>{{message}}</div>
    <!--与上面实现的效果一样-->
    <div v-text="message"></div>
</div>

v-html(了解)

用于将html字符串转成相应的样式

<div id="app">
    <div v-html="message"></div>
</div>

message = `<h2>hahaha</h2>`

v-pre(了解)

用于跳过元素和子元素的编译过程,显示原始的Mustache标签

image.png

v-bind的绑定属性

可以绑定一个或者多个属性值,或者向另外一个组件传递props值

  • 前面的属性主要是将内容插入到元素中
  • 而某些元素的属性也希望动态绑定
    • 比如图片、连接、动态绑定一些类,样式等
<div id="app">
    基本使用
    <img v-bind:src="url">
    简写
    <img :src="url">
</div>

绑定class属性

  • 动态class通过对象语法绑定
    • key:代表类名
    • value:传入一个boolean值
    • 可以传入多个
<style>
    .titleClass {
    }
    .textClass {
    }
    .abc{}
</style>
<div id="app">
    <div :class="{titleClass:true,textClass:flag}"></div>
    //会将普通的class进行合并
     <div class="abc" :class="{titleClass:true,textClass:flag}"></div>
</div>
  • 动态class通过数组语法绑定
<style>
    .titleClass {
    }
    .textClass {
    }
    .abc{}
</style>
<div id="app">
    <div :class="['titleClass','textClass']"></div>
</div>

绑定style属性

  • 使用 v-bind绑定style,后面要跟着对象
    • 对于 font-size中间带 **-**的属性,需要用引号包起来或者写成驼峰形式
<div id="app">
    //普通写法
    <div style="color:red"></div>
    <div :style="{color:textRed,fontSize:'30px'}"></div>
</div>
  • 同时也有数组写法
    • 通常是多个对象联合使用
<div id="app">
    <div :style="[colorObject,fontSizeObject]"></div>
</div>

绑定属性名

<div id="app">
    <div :[className]="[colorObject,fontSizeObject]"></div>
</div>

data(){
	return{
		className:"style"
	}
}

直接绑定对象

  • 在元素中,直接通过 v-bind = 'obj'即可
    • 会自动遍历obj中的key,将key添加到元素上面
    • 通常用于组件间传值
<div id="app">
    <div v-bind="infos">hello</div>
</div>

image.png

v-on绑定事件

基本使用方法

<div id="app">
    <!-- 完整写法 -->
    <div v-on:click="divClick">hello</div>
    <!-- 语法糖 -->
    <div @click="divClick">hello2</div>
    <!-- 可以写成表达式 -->
    <div @click="console.log(456)">hello3</div>
    <!-- 绑定其他方法 -->
    <div @mousemove="divClick">hello4</div>
    <!-- 绑定多个事件 -->
    <div @click="divClick" @mousemove="divMove">hello5</div>
</div>
<script>
    //使用Vue
    const app = Vue.createApp({
        methods: {
            divClick() {
                console.log("click");
            },
            divMove() {
                console.log("move");
            },
        },
    });
    //挂载
    app.mount("#app");
</script>

参数传递

  • 没有传递参数,默认会传递一个 event参数
<div id="app">
    <button @click="divClick">123</button>
</div>
<script>
    //使用Vue
    const app = Vue.createApp({
        methods: {
            divClick(event) {
                //默认参数event
                console.log(event);
            },
        },
    });
    //挂载
    app.mount("#app");
</script>
  • 有明确的参数,会将 默认参数event覆盖
<div id="app">
    <button @click="divClick('zhangcheng')">123</button>
</div>
<script>
    //使用Vue
    const app = Vue.createApp({
        methods: {
            divClick(data) {
                //默认参数event
                console.log(data);
            },
        },
    });
    //挂载
    app.mount("#app");
</script>
  • 自己的参数和默认参数event
    • 通过 $event
<div id="app">
    <button @click="divClick('zhangcheng',$event)">123</button>
</div>
<script>
    //使用Vue
    const app = Vue.createApp({
        methods: {
            divClick(data, event) {
                //默认参数event
                console.log(data, event);
            },
        },
    });
    //挂载
    app.mount("#app");
</script>

修饰符

image.png

  • 通过 @click.stop="divClick"进行使用

条件渲染

在某些情况下,一些元素需要根据特定的条件进行显示

  • v-if v-else v-else-if v-show
<div id="app">
    <div v-if="flag">flag为true显示</div>
    <div v-else>flag为false显示</div>
</div>
<script>
    //使用Vue
    const app = Vue.createApp({
        data() {
            return {
                flag: true,
            };
        },
    });
    //挂载
    app.mount("#app");
</script>
  • template元素的使用(Vue3提出来的)
    • 该元素通常配合v-if使用
    • 且该元素可以包含多个子元素
    • 该元素不会渲染到DOM树上
<template v-if="flag">
    <div>flag为true显示</div>
    <div>flag为false显示</div>
</template>
  • v-ifv-show的区别是
    • v-if条件不成立的时候,DOM不会渲染或者被销毁掉
    • v-show的元素会被渲染,只是通过CSS的display进行控制
    • v-if支持template,但是 v-show不能

v-for列表渲染

可以遍历可迭代对象

  • 在真实开发中,我们通常从服务器中获取一组数据
  • 而要将这一组数据,都展示在页面中,就需要使用 v-for进行遍历

基本使用

<div id="app">
    <!-- 直接获取内容 -->
    <div v-for="item in arr">{{item}}</div>
    <!-- 获取内容和索引值,顺序不能动 -->
    <div v-for="(item,index) in arr">item:{{item}};index:{{index}}</div>
</div>
<script>
    //使用Vue
    const app = Vue.createApp({
        data() {
            return {
                arr: [1, 2, 3],
            };
        },
    });
    //挂载
    app.mount("#app");
</script>

支持的类型

  • v-for不仅支持遍历数组
  • 同样也支持遍历对象
<div id="app">
    <!-- 遍历对象,value代表value -->
    <div v-for="value in obj">{{value}}</div>
    <!-- 遍历对象,(value,key,index)代表value,key以及索引 -->
    <div v-for="(value,key,index) in obj">{{value}}-{{key}}-{{index}}</div>
</div>
<script>
    //使用Vue
    const app = Vue.createApp({
        data() {
            return {
                obj: {
                    name: "zhangcheng",
                    age: "18",
                },
            };
        },
    });
    //挂载
    app.mount("#app");
</script>
  • 遍历字符串(可迭代对象)
<div id="app">
    <div v-for="value in str">{{value}}</div>
</div>
<script>
    //使用Vue
    const app = Vue.createApp({
        data() {
            return {
                str:"abcsde"
            };
        },
    });
    //挂载
    app.mount("#app");
</script>
  • 可以遍历数字
<div id="app">
    <div v-for="value in 10">{{value}}</div>
</div>
<script>
    //使用Vue
    const app = Vue.createApp({
    });
    //挂载
    app.mount("#app");
</script>

数组更新检测

  • Vue中对一些数组的方法进行了包裹,这些方法在对数组进行操作的时候,可以更新视图
  • 这些方法对原数组进行了改变

image.png

<div id="app">
    <div v-for="item in arr">{{item}}</div>
    <button @click="arrChange">change</button>
</div>
<script>
    //使用Vue
    const app = Vue.createApp({
        data() {
            return {
                arr: [1, 2, 3],
            };
        },
        methods: {
            arrChange() {
                this.arr.push(4);
            },
        },
    });
    //挂载
    app.mount("#app");
</script>
  • 而针对于不改变原数组,且生成新数组的方法,不可以更新视图
  • 需要重新赋值
<div id="app">
    <div v-for="item in arr">{{item}}</div>
    <button @click="arrChange">change</button>
</div>
<script>
    //使用Vue
    const app = Vue.createApp({
        data() {
            return {
                arr: [1, 2, 3],
            };
        },
        methods: {
            arrChange() {
               this.arr = this.arr.map(item=>item+"zc")
            },
        },
    });
    //挂载
    app.mount("#app");
</script>

v-for中的key作用是什么

通常在使用v-for的时候,需要搭配key一同使用

  • key的要求是唯一的
    • key属性主要用在 Vue的虚拟DOM算法,在新旧nodes对比辨识 VNodes
    • key存在的时候,对元素进行了改变,会尽可能地复用相同地节点
    • 没有 **key存在的时候,**不会对元素进行复用
<div id="app">
    <div v-for="item in arr" :key="item">{{item}}</div>
</div>
<script>
    //使用Vue
    const app = Vue.createApp({
        data() {
            return {
                arr: [1, 2, 3],
            };
        },
    });
    //挂载
    app.mount("#app");
</script>
认识VNode
  • VNode是虚拟节点
  • 在 Vue中无论是组件还是元素都是VNode(虚拟节点)
  • 本质就是一个JS对象

image.png

image.png

虚拟DOM

方便对代码进行跨平台操作以及diff算法

  • 如果我们不仅仅只有一个div,而是复杂的嵌套元素
  • 这些会生成一个 VNode Tree
  • 即为虚拟 DOM

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

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

相关文章

oracle19C 密码包含特殊字符@ 导致ORA-12154

oracle 19C 密码包含特殊字符 出现登录失败&#xff0c;针对此问题一次说个明白 ORA-12154: TNS:could not resolve the connect identifier specified Oracle 19c之前密码是可以包含特殊字符&#xff0c;但是如果包含特殊字符需要双引号 比如oracle11g 正常 如果密码包含特殊…

创新大赛专访丨金智维荣膺2023年度数字化创新服务卓越品牌:专注提供企业级RPA平台,重塑企业生产力,让员工更有价值

日前&#xff0c;2023第三届全国人力资源创新大赛颁奖典礼暨成果展圆满举行。自2023年10月份启动以来&#xff0c;大赛共吸引了457个案例报名参赛&#xff0c;经组委会专家团队评审严格审核&#xff0c;企业赛道共有103个案例获奖、72家企业、13位个人、7个产业园斩获荣誉。 珠…

帮管客CRM SQL注入漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

简单实践 java spring boot 自动配置模拟

1.概要 1.1 需求&#xff0c;自己写一个redis-spring-boot-starter模拟自动配置 自动配置就是在引入*-starter坐标后&#xff0c;可以已经spring框架的规则实现一些Bean的自动注入&#xff0c;并设置一些参数的默认值&#xff0c;且也可以在引入的工程中修改这些配置的值。这…

C#代码添加脚本头

目录 前言 代码展示 前言 创建脚本的时候添加脚本的介绍 代码展示 using System.IO;/// <summary> /// 创建脚本自动添加头注 /// </summary> public class CommentFirst : UnityEditor.AssetModificationProcessor {/// <summary>/// 在资源创建生成.me…

springboot整合RabbitMQ,RabbitMQ实现高级特性消息不丢失

1.生产者可靠性消息投递 简单操作参考---------打开主页上篇博客 https://blog.csdn.net/weixin_45810161/article/details/135906602?spm1001.2014.3001.5501 在使用RabbitMQ的时候,怎么保证保证消息不丢失,RabbitMQ提供了两种不同的方式来控制消息的可靠性投递 1.confirm…

js中的数据类型(存储上的差别)

文章目录 前言一、基本类型NumberUndefinedStringNullBooleanSymbol 二、引用类型ObjectArrayFunction其他引用类型 三、存储区别基本类型引用类型 小结 前言 在JavaScript中&#xff0c;我们可以分成两种类型&#xff1a; 基本类型复杂类型 两种类型的区别是&#xff1a;存…

老版本labelme如何不保存imagedata

我的版本是3.16&#xff0c;默认英文且不带取消保存imagedata的选项。 最简单粗暴的方法就是在json文件保存时把传递过来的imagedata数据设定为None&#xff0c;方法如下&#xff1a; 找到labelme的源文件&#xff0c;例如&#xff1a;D:\conda\envs\deeplab\Lib\site-packages…

jsp自助点餐管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 自助点餐管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0…

PCB笔记(二十三):allegro 标注长宽(一般用于测量板宽)时如何显示双单位

步骤&#xff1a;首先选择标注工具&#xff0c;然后右键→Parameters&#xff0c;在弹出来的窗口中√上如下图二所示选项 最终要达到显示单位的效果的话&#xff0c;需要在Text项键入%v%u。 今天就记录到这里啦O

Jmeter直连mysql数据库教程

mysql数据库能够通过Navicat等远程连接工具连接 下载驱动并加入jmeter 1.mysql驱动下载地址&#xff1a;MySQL :: Download MySQL Connector/J (Archived Versions) 找到对应的驱动下载&#xff1a;如下图&#xff1a; 把驱动jar包加入jmeter 配置jmeter连接mysql数据库…

正则表达式与文本处理工具

目录 引言 一、正则表达式基础 &#xff08;一&#xff09;字符匹配 1.基本字符 2.特殊字符 3.量词 4.边界匹配 &#xff08;二&#xff09;进阶用法 1.组与引用 2.选择 二、命令之-----grep &#xff08;一&#xff09;基础用法 &#xff08;二&#xff09;高级用…

数据结构——实验01-线性表的链式存储和操作

一、实验内容 二、算法思想与算法实现 1、解题思想 &#xff08;1&#xff09;逆序创建链表La就是使用头插法创建一个链表&#xff0c;所谓头插法就是在创建链表时始终将新元素插入到头结点之后&#xff0c;而正序创建链表Lb就是使用尾插法创建一个链表&#xff0c;所谓尾插法…

Spring Bean 生命周期常见错误

虽然说 Spring 容器上手简单&#xff0c;可以仅仅通过学习一些有限的注解&#xff0c;即可达到快速使用的目的。但在工程实践中&#xff0c;我们依然会从中发现一些常见的错误。尤其当你对 Spring 的生命周期还没有深入了解时&#xff0c;类初始化及销毁过程中潜在的约定就不会…

AJAX-URL查询参数

定义&#xff1a;浏览器提供给服务器的额外信息&#xff0c;让服务器返回浏览器想要的数据 http://xxxx.com/xxx/xxx?参数名1值1&参数名2值2 axios语法 使用axios提供的params选项 注意&#xff1a;axios在运行时把参数名和值&#xff0c;会拼接到url?参数名值 axios(…

第5课 使用FFmpeg将rtmp流再转推到rtmp服务器

本课对应源文件下载链接&#xff1a; https://download.csdn.net/download/XiBuQiuChong/88801992 通过前面的学习&#xff0c;我们已经可以正常播放网络rtmp流及本地mp4文件。这节课&#xff0c;我们将在前面的基础上实现一个常用的转推功能&#xff1a;读取rtmp流或mp4文件并…

matlab|【EI复现】日前日内多阶段多时间尺度源荷储协调调度

目录 一、模型 二、程序运行 三、下载链接 多阶段多时间尺度的协调调度的优势是考虑新能源出力的波动性与随机性&#xff0c;减少需求响应负荷的不确定性对电网制定的日前调度计划准确性造成的影响&#xff0c;也就是能够更加精准的进行调度和分析&#xff0c;优化结果的可用…

(java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~

目录 冒泡排序(BubbleSort)&#xff1a; 代码详解&#xff1a; 冒泡排序的优化&#xff1a; 选择排序(SelectSort)&#xff1a; 代码详解&#xff1a; 插入排序&#xff08;InsertSort&#xff09;&#xff1a; 代码详解&#xff1a; 希尔排序(ShellSort)&#xff1a; 法一…

【数据结构与算法】之排序系列-20240202

这里写目录标题 一、389. 找不同二、414. 第三大的数三、455. 分发饼干四、506. 相对名次五、561. 数组拆分六、594. 最长和谐子序列 一、389. 找不同 简单 给定两个字符串 s 和 t &#xff0c;它们只包含小写字母。 字符串 t 由字符串 s 随机重排&#xff0c;然后在随机位置添…

双非本科准备秋招(14.3)—— java线程

创建和运行线程 1、使用Thread Slf4j(topic "c.Test1")public class Test1 {public static void main(String[] args) {Thread t new Thread("t1") {Overridepublic void run() {log.debug("running");}};t.start();​log.debug("runnin…