Vue - 2( 10000 字 Vue 入门级教程)

一:Vue

1.1 绑定样式

1.1.1 绑定 class 样式

<!DOCTYPE html>
<html><head><meta charset="UTF-8" /><title>绑定样式</title><style>......</style><script type="text/javascript" src="../js/vue.js"></script></head><body><!-- 准备好一个容器--><div id="root"><!-- 绑定class样式--字符串写法,适用于:样式的类名不确定,需要动态指定 --><div class="basic" :class="mood" @click="changeMood">{{name}}</div> <br/><br/><!-- 绑定class样式--数组写法,适用于:要绑定的样式个数不确定、名字也不确定 --><div class="basic" :class="classArr">{{name}}</div> <br/><br/><!-- 绑定class样式--对象写法,适用于:要绑定的样式个数确定、名字也确定,但要动态决定用不用 --><div class="basic" :class="classObj">{{name}}</div> <br/><br/</div></body><script type="text/javascript">Vue.config.productionTip = falseconst vm = new Vue({el:'#root',data:{name:'尚硅谷',mood:'normal',classArr:['atguigu1','atguigu2','atguigu3'],//三个类名都会被应用到元素上classObj:{atguigu1:false,//Vue 根据对象中属性的初始布尔值,决定是否应用相应的类名。atguigu2:false,//Vue 根据对象中属性的初始布尔值,决定是否应用相应的类名。},},methods: {changeMood(){const arr = ['happy','sad','normal']const index = Math.floor(Math.random()*3)this.mood = arr[index]}},})</script>
</html>

这段代码演示了在 Vue 中绑定 class 的三种方式:字符串写法、数组写法、对象写法。

  1. 字符串写法

    <div class="basic" :class="mood" @click="changeMood">{{name}}</div>
    

    这里使用了:class指令来动态绑定类名字符串。在 Vue 实例中,mood 是一个字符串变量,它的值会根据用户行为而变化。

    代码中的mood变量会作为类名应用到这个<div>元素上。当用户点击这个元素时,changeMood 方法会被调用,修改 mood 的值,从而改变应用的类名。

  2. 数组写法

    <div class="basic" :class="classArr">{{name}}</div>
    

    这里使用了:class指令来动态绑定类名数组classArr。在 Vue 实例中,classArr 是一个包含多个类名的数组,类名可以根据需要动态生成。

    数组中的类名会被依次应用到这个<div>元素上。在这个例子中,atguigu1atguigu2atguigu3三个类名都会被应用到元素上。

  3. 对象写法

    <div class="basic" :class="classObj">{{name}}</div>
    

    这里使用了:class指令来动态绑定类名对象classObj。在 Vue 实例中,classObj 是一个包含多个类名的对象,类名可以根据需要动态生成。

    对象中的属性会根据其布尔值动态应用或移除相应的类名。在这个例子中,atguigu1atguigu2 的初始值为 false,因此对应的类名不会被应用。当需要时,可以通过改变对象中属性的值来动态控制类名的应用或移除。

这三种方式都可以根据 Vue 实例中的数据动态生成类名,实现样式的动态变化。

1.1.2 绑定 style 样式

**<!DOCTYPE html>
<html><head><meta charset="UTF-8" /><title>绑定样式</title><style>......</style><script type="text/javascript" src="../js/vue.js"></script></head><body><!-- 准备好一个容器--><div id="root"><!-- 绑定style样式--对象写法 --><div class="basic" :style="styleObj">{{name}}</div> <br/><br/><!-- 绑定style样式--数组写法 --><div class="basic" :style="styleArr">{{name}}</div></div></body><script type="text/javascript">Vue.config.productionTip = falseconst vm = new Vue({el:'#root',data:{name:'尚硅谷',styleObj:{fontSize: '40px',color:'red',},styleObj2:{backgroundColor:'orange'},styleArr:[{fontSize: '40px',color:'blue',},{backgroundColor:'gray'}]},},})</script></html>**

这段代码演示了在 Vue 中绑定样式的两种方式:对象写法和数组写法。

  1. 对象写法

    <div class="basic" :style="styleObj">{{name}}</div>
    

    这里使用了:style指令来动态绑定样式对象styleObj。在Vue实例,styleObj被定义为一个包含 CSS 属性和值的对象,如{ fontSize: '40px', color: 'red' }

    代码中的styleObj被应用到这个<div>元素上,其中fontSize: '40px'定义了字体大小为40像素,color: 'red'定义了文本颜色为红色。

  2. 数组写法

    <div class="basic" :style="style">{{name}}</div>
    

    这里使用了:style指令来动态绑定样式数组styleArr。在Vue实例中,styleArr被定义为一个包含多个样式对象的数组,如[{ fontSize: '40', color: 'blue' }, { backgroundColor: 'gray' }]

    数组中的样式对象被依次应用到这个<div>元素上,第一个对象定义了字体大小为40像素,文本颜色为蓝色,第二个对象定义了背景颜色为灰色。

1.2 条件渲染

在 Vue 中,条件渲染是一种根据数据的值来动态显示或隐藏 DOM 元素的技术。Vue 提供了多种方式来实现条件渲染,包括-ifv-else-ifv-elsev-show等指令。

1.2.1. v-if 和 v-else-if`和 v-else

v-if 指令用于根据表达式的值来决定是否渲染一个元素,如果表达式返回 true,则元素被渲染,否则不被渲染。v-else-ifv-else 则用于在v-if之后添加额外的条件逻辑。

  <p v-if="seen">现在你看到我了</p><p v-else-if="type === 'A'">Type A</p><p v-else-if="type === 'B'">Type B</p><p v-else>Type C</p>
</div><script>
new Vue({el: '#app',data: {seen: true,type: 'B'}
})
</script>

在这个示例中,<p> 标签根据 seen 的值来决定是否渲染。当 seentrue 时,第一个 <p> 标签被渲染;如果 seenfalse,则该元素不会被渲染。另外,根据 type 的值,也可以决定渲染不同的 <p> 元素。

1.2.2. v-show

v-show 指令也用于根据表达式的值来控制元素的显示与隐藏,但是与 v-if 不同的是,无论条件是否为真,被绑定的元素始终会被渲染到 DOM 中,只是通过 CSS 的 display 属性来控制显示与隐藏。

<div id="app"><p v-show="seen">现在你看到我了</p>
</div><script>
new Vue({el: '#app',data: {seen: true}
})
</script>

在这个示例中,<p> 元素始终存在于 DOM 中,但是根据 seen 的值,它可能是可见的(display: block)或不可见的(display: none)。

条件渲染的选择:

  • v-if 适用于:切换频率较低的场景。
  • v-show 适用于:切换频率较高的场景。

1.2.3 v-if与template的配合使用

在 Vue 中,v-if 指令通常用于条件性地渲染一块内容。有时候,我们可能需要在多个元素之间进行条件渲染,但又不想向 DOM 中添加额外的标签。这时,可以使用 <template> 元素与 v-if 指令结合起来,以实现条件渲染而不引入额外的 DOM 元素。

以下是使用 v-if<template> 的配合示例:

<template v-if="isTrue"><h1>Title</h1><p>Content</p>
</template><template v-else><h1>Another Title</h1><p>Another Content</p>
</template>

在这个示例中,<template> 元素内部包含了要条件渲染的内容,根据 v-if 指令的值来决定是否渲染这段内容。当 isTruetrue 时,第一个 <template>素内部的内容会被渲染,否则渲染第二个 <template> 内部的内容。

通过这种方式,即使我们在模板中使用了 v-if 进行条件渲染,但最终渲染到 DOM 中的内容不会包裹在额外的标签内。这对于需要条件渲染但又不想引入多余的 DOM 元素的情况非常有用。

需要注意的是,<template> 元素在渲染时不会出现在最终的 DOM 中,它只是作为一个逻辑容器来帮助进行条件渲染。

1.3 列表渲染

1.3.1 v-for

在 Vue 中,v-for 指令用于迭代数组或对象,并为每项数据渲染出对应的元素。

v-for 的语法格式为 v-for="item in items",其中 item 是数组中的每一项,items 是要遍历的数组。

下面我将详细介绍 v-for 的用法。

作用一:迭代数组:

在 Vue 中,使用 v-for 迭代数组非常常见。下面是一个简单的示例:

<div id="app"><ul><li v-for="item in items">{{ item }}</li></ul>
</div><script>
new Vue({el: '#app',data: {items: ['Apple', 'Banana', 'Orange']}
})
</script>

运行结果如图所示:
在这里插入图片描述

这段代码的执行流程:

  • 当页面加载时,Vue 实例被创建并挂载到 idapp<div> 元素上。
  • Vue 实例开始解析模板,遇到 v-for 指令时,它会遍历 items 数组中的每一项,并为每一项生成一个 <li> 元素,并将当前项的值插入到 <li> 元素的内容中。
  • Vue 实例将解析后的 DOM 结构渲染到页面上,用户就可以看到每个水果名字显示在无序列表中的各个列表项中。
  • 如果后续有任何对 items 数组的修改(例如添加、删除或更新数组中的项),Vue 实例会检测到这些变化并相应地更新 DOM,以保持页面与数据的同步。

作用二:获取索引值

有时候我们需要获取每一项数据的索引值,可以使用第二个参数来获取索引:

<div id="app"><ul><li v-for="(item, index) in items">{{ index }}. {{ item }}</li></ul>
</div><script>
new Vue({el: '#app',data: {items: ['Apple', 'Banana', 'Orange']}
})
</script>

在这个示例中,(item, index) 中的 index 就是每一项数据的索引值。

作用三:迭代对象

除了迭代数组,v-for 也可以用于迭代对象的键值对:

<div id="app"><ul><li v-for="(value, key) in object">{{ key }}: {{ value }}</li></ul>
</div><script>
new Vue({el: '#app',data: {object: {name: 'John',age: 30,gender: 'male'}}
})
</script>

在这个示例中,(value, key) 中的 value 是对象的值,key 是对象的键。

作用四:在 v-for 中使用对象的 value 和 key

有时候我们只需要对象的值,或者只需要键,可以使用 v-for 的特殊语法:

  • 只获取对象的值:
<div v-for="value in object">{{ value }}</div>
  • 只获取对象的键:
<div v-for="key in object">{{ key }}</div>

作用五:带有 v-for 的 <template>

有时候我们需要在一个元素上使用多个 v-for,但是又不想引入额外的标签,可以使用 <template> 元素:

<div id="app"><template v-for="item in items"><p>{{ item }}</p><span>{{ item }}</span></template>
</div><script>
new Vue({el: '#app',data: {items: ['Apple', 'Banana', 'Orange']}
})
</script>

在这个示例中,<template> 元素内部的内容会根据 items 数组中的每一项数据进行渲染,但最终渲染到 DOM 中的内容不会包裹在额外的标签内。

作用六:遍历字符串

代码示例:

<div id="app"><p v-for="(char, index) in message" :key="index">{{ char }}</p>
</div><script>
new Vue({el: '#app',data: {message: 'Hello Vue!'}
})
</script>

在这个例子中,我们将一个字符串 'Hello Vue!' 存储在 Vue 实例的 message 数据属性中。然后,我们使用 v-for 指令来遍历这个字符串。

  • (char, index) in message:这里的 char 表示字符串中的每个字符,index 表示每个字符在字符串中的索引。
  • :key="index"key 是必须的,它用来帮助 Vue 识别每个 <p> 元素的唯一性,以便在更新 DOM 时进行高效的重渲染。

每次迭代,Vue 将渲染一个 <p> 元素,显示当前字符 char 的值。

执行流程:

  1. 页面加载时,Vue 实例被创建并挂载到 idapp<div> 元素上。
  2. Vue 实例开始解析模板,遇到 v-for 指令时,它会遍历 message 字符串中的每个字符。
  3. 对于每个字符,Vue 实例将创建一个 <p> 元素,并将当前字符的值插入到 <p> 元素的内容中。
  4. Vue 实例将解析后的 DOM 结构渲染到页面上,用户可以看到每个字符显示在独立的 <p> 元素中。

页面渲染结果:

在这里插入图片描述

每个字符都被渲染为一个独立的 <p> 元素,并按照它们在字符串中的顺序显示出来。

1.3.2 key 的作用

虚拟DOM中key的作用:

在Vue.js中,当渲染列表或者进行动态数据更新时,Vue会使用虚拟DOM来描述真实DOM的结构。而key就是虚拟DOM对象的标识,它的作用在于帮助Vue识别每个虚拟DOM节点的唯一性。

对比规则:

在更新虚拟DOM时,Vue需要比较新旧虚拟DOM,以确定具体的更新操作。比较的规则如下:

  • 当在旧虚拟DOM中找到与新虚拟DOM相同的key时:

    • 若虚拟DOM中内容没变,则直接使用之前的真实DOM,不做更新操作。
    • 若虚拟DOM中内容发生了变化,则生成新的真实DOM,并替换页面中之前的真实DOM。
  • 当在旧虚拟DOM中未找到与新虚拟DOM相同的key时:

    • 创建新的真实DOM,并将其渲染到页面中。

.用index作为key可能会引发的问题:

在某些情况下,使用列表的索引(index)作为key可能会导致一些问题:

  1. 若对数据进行逆序添加、逆序删除等破坏顺序的操作时,会导致没有必要的真实DOM更新,这会降低页面的效率。
  2. 如果列表中的结构还包含了输入类的DOM,使用index作为key可能会导致错误的DOM更新,从而使界面出现问题。

开发中如何选择key?

在选择key时,我们应该考虑以下几点:

  1. 最好使用每条数据的唯一标识作为key,例如id、手机号、身份证号、学号等具有唯一性的值。
  2. 如果确定不会对数据进行逆序添加、逆序删除等破坏顺序的操作,并且仅用于渲染列表用于展示,那么使用index作为key是没有问题的。

现在,让我们来看一个简单的代码示例:

假设我们有一个列表需要渲染:

<template><div><ul><li v-for="(item, index) in items" :key="item.id">{{ item.name }}</li></ul></div>
</template><script>
export default {data() {return {items: [{ id: 1, name: 'Item 1' },{ id: 2, name: 'Item 2' },{ id: 3, name: 'Item 3' }]};}
};
</script>

在上面的例子中,我们使用了每个item对象的id作为key,因为id是每个数据项的唯一标识符。这样做可以确保在数据更新时,Vue能够正确地识别每个列表项,从而进行高效的更新操作。

1.3.3 列表过滤

在Vue中,列表过滤通常指的是根据特定条件筛选出列表中的部分项进行展示。这在实际开发中非常常见,特别是当你需要根据用户输入或其他条件来动态显示数据时。

假设我们有一个包含一些用户的列表,我们想要实现一个搜索框,用户可以在搜索框中输入关键词,然后列表会根据输入的关键词动态过滤显示相匹配的用户。

HTML 模板:

<template><div><input type="text" v-model="searchKeyword" placeholder="Search..."><ul><li v-for="(user, index) in filteredUsers" :key="user.id">{{ user.name }}</li></ul></div>
</template>

Vue 实例:

<script>
export default {data() {return {searchKeyword: '', // 用户输入的搜索关键词users: [  // 初始用户列表{ id: 1, name: 'Alice' },{ id: 2, name: 'Bob' },{ id: 3, name: 'Charlie' },{ id: 4, name: 'David' }]};},computed: {filteredUsers() {// 使用计算属性过滤用户列表return this.users.filter(user => {return user.name.toLowerCase().includes(this.searchKeyword.toLowerCase());});}}
};
</script>

在Vue实例中,我们定义了一个名为searchKeyword的data属性,用于存储用户输入的搜索关键词。然后,我们有一个名为users的数组,包含了初始的用户列表。

接着通过 filteredUsers 计算属性动态过滤用户列表,下面是这段代码的执行流程:

  1. 定义计算属性:在Vue实例中,我们使用computed属性定义了一个名为filteredUsers的计算属性。

  2. 计算属性逻辑:在filteredUsers计算属性中,我们使用了this.users.filter()方法。这个方法用于对this.users数组中的每个元素进行筛选,返回一个新的数组,该数组包含满足条件的元素。在这里,我们使用了箭头函数来定义filter的筛选条件。

  3. 筛选条件:我们的筛选条件是user.name.toLowerCase().includes(this.searchKeyword.toLowerCase())。这个条件首先将user.namethis.searchKeyword转换为小写字母,然后通过includes()方法检查user.name中是否包含this.searchKeyword

  4. 动态更新:由于filteredUsers是一个计算属性,当this.searchKeyword发生变化时,Vue会自动重新计算filteredUsers,从而更新列表中显示的内容。这样就实现了根据用户输入动态过滤列表的功能。

所以这段代码通过计算属性实现了动态过滤用户列表的功能,用户可以通过输入搜索关键词来实时筛选出感兴趣的用户。

1.3.4 Vue监测数据改变的原理

当 Vue 实例创建时,会对 data 中的数据进行加工。加工的过程主要包括以下步骤:

  1. 配置 Getter 和 Setter
    Vue 会遍历 data 中的每个属性,并为每个属性配置 getter 和 setter 方法。这样做的目的是为了在属性被访问或修改时获操作,从而实现响应式数据的跟踪和更新。

  2. 代理
    加工完成后,Vue 将 data 中的数据拷贝到 _vm.data 中,此时你可以通过 this.xxx 的方式直接访 data 中的数据,而不需要通过 _vm.data.xxx的形式。

  3. 数据监听
    在 setter 方法中,Vue 实现了一种调用机制,当数据被修改时,会调用这个方法。 setter 方法中写了一个引用,而这个引用能够引起模板的重新解析。

通过以上步骤,Vue 实现了数据的响应式监测,使数据变化能够自动更新相关视图,从实现了 Vue 监测数据改的原理。

在这里插入图片描述

1.3.5 Vue.set 和 this.$set 方法

Vue使用setter来实现监测对象中的数据,这意味着在创建Vue实例时就需要传入要监测的数据。

对于后追加的属性,Vue默认不会做响应式处理,这意味着如果你在data中定义了一个对象,后续再给这个对象添加属性时,Vue不会自动更新相关视图。

若要让后添加的属性也具有响应式,需要使用Vue提供的API:Vue.setthis.$set 方法

Vue.setthis.$set 方法用于向响应式对象添加响应式属性,确保当属性被添加时,能够触发视图更新。

举个例子:

// 假设 student 对象在 data 中已经定义
Vue.set(this.student, 'sex', '男');//两种形式都可以
this.$set(this.student, 'sex', '男');

在这个例子中,假设 student 是一个响应式对象,我们想要添加一个新的属性 sex,并且还希望 Vue 能够监听到这属性的变化。

此时我们可以使用 Vue.set.$set 方法,将sex 属性添加到 student 中,并赋予其初始值 `‘男’。此后,Vue 将会监到 sex 属性的变化,并图中进行更新。

1.3.6 总结数据监视

Vue监视数据的原理:

vue会监视data中所有层次的数据

如何监测对象中的数据?

通过setter实现监视,且要在new Vue时就传入要监测的数据

(1)对象中后追加的属性,Vue默认不做响应式处理
(2)如需给后添加的属性做响应式,请使用如下API:

  1. Vue.set(target,propertyName/index,value)
  2. vm.$set(target,propertyName/index,value)

如何监测数组中的数据?

通过包裹数组更新元素的方法实现,本质就是做了两件事:

(1)调用原生对应的方法对数组进行更新
(2)重新解析模板,进而更新页面

在Vue修改数组中的某个元素一定要用如下方法:

  1. 使用这些API:push()、pop()、shift()、unshift()、splice()、sort()、reverse()

这些方法已经被Vue重写,能够触发响应式更新,这些方法的本质是两步:首先调用原生数组方法对数组进行更新,然后重新解析模板,从而更新页面。

  1. Vue.set() 或 vm.$set()

另外,也可以使用Vue.set()或vm.$set()方法来修改数组中的元素。这两个方法的作用是确保数组中的数据变化能够被响应式地更新。

特别注意:Vue.set() 和 vm.$set() 不能给vm 或 vm的根数据对象(data等) 添加属性

这个限制存在的原因是Vue.js的响应式系统的实现机制。

Vue.js的响应式系统在实例化时会对数据进行加工,包括配置getter和setter方法,以及执行数据代理等操作。这些操作是在Vue实例的初始化阶段完成的。在这个过程中,Vue会对data中的数据进行遍历和处理,为每个属性配置相应的监测机制,以便能够捕捉到数据的变化并触发相的更新操作。

然而,当Vue实例已经创建完成后,它的根数据对象已经被加工完毕,Vue不再允许动态地向根数据对象添加新的响应式属性。因为在实例化之后,Vue.js已经无法再对根数据对象进行监测和加工,所以在这个阶段使用Vue.set()vm.$set()来添加属性是无效的。

所以,为了确保数据的响应式特性,如果需要在Vue实例创建之后动态添加新的属性,应该在实例化时就预先声明这些属性。这样,Vue.js就能够正确地处理这些属性,并保证它们的响应式特性。

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

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

相关文章

基于java web的超市管理系统

摘要 随着社会经济的不断发展&#xff0c;人们的生活水平不断提高。越来越多的零售行业得到了快速的发展&#xff0c;以最常见的超市最为明显。零售行业繁荣的背后也随之带来了许多行业隐患&#xff0c;越来越激烈的行业竞争不断的要求经营者更加高要求的管理超市内部的整个供…

代码随想录第31天 | 455.分发饼干 、376. 摆动序列、53. 最大子序和

一、前言 参考文献&#xff1a;代码随想录 今天的内容是贪心算法&#xff0c;这个算法分为两个极端&#xff0c;一个极端是很简单&#xff0c;靠常识就可以解出来&#xff0c;另外一个是&#xff0c;你怎么想也想不出来&#xff0c;只能看题解的那种。 and 对第一天和第二天…

微信小程序上传到gitee

共三步 1、新建gitee仓库 点号&#xff0c;新建仓库&#xff0c;填入仓库信息新建即可 2、修改版本管理参数 微信开发者工具中点开版本管理&#xff0c;未初始化&#xff0c;需要先点初始化 接下来将设置中的通用、网络认证、远程3个部分的参数填写好 通用&#xff1a;核对…

DashOJ-8.奇偶统计

题目链接&#xff1a; 题目详情 - 奇偶统计 - DashOJ 思路&#xff1a; &#xff08;while循环加if分支语句&#xff09; 巧用死循环 while(1) 然后在里面第一句就判断输入的数字是否等于0 if(x0) &#xff0c;如果 等于0就直接break跳出循环 或者用 while(cin>>x) 代…

echarts 地图 自己圈地图 乡镇街道

这个是方式是我实在不愿意做的&#xff01; 如果有现成的最好&#xff0c;没有办法的情况下再用这个东西。 今天公司有一个项目&#xff0c;地方划分了一块区域&#xff0c;但是国家没有审核&#xff0c;但是项目里面用到了一个地图展示数据&#xff01;然后就需要我们自己把…

非conda环境(powershell与cmd)使用opencv-python库

1.安装python 3.11.7 Python Release Python 3.11.7 | Python.org 安装成功后,查看版本为3.11.7 2.安装numpy pip install numpy 3.安装matplotlib pip install matplotlib matplotlib库安装成功

k8s CNI Calico 网络模式总结

目录 calico架构图 IPIP模式下的架构图 calico 核心组件 Overlay 网络模式&#xff1a; Pod IP对外暴露 不对外暴露&#xff1a; 实现对外暴露的方法&#xff1a; overlay模式下的网络MTU Iptables & ipvs overlay的主要缺点&#xff1a; Full-mesh Unoverla…

【Linux】基础IO—1

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 文章目录 前言 先来段代码回顾C文件接口 "w"写文件 "a"追加文件 "r"读文件 输出信息到显示器&#xff0c;你有哪些方法 stdin & std…

Git入门实战教程之创建版本库

一、Git简介 Git是一个分布式版本控制系&#xff0c;分层结构如下&#xff1a; Git分为四层&#xff1a; 1、工作目录 当前正在工作的项目的实际文件目录&#xff0c;我们执行命令git init时所在的地方&#xff0c;也就是我们执行一切文件操作的地方。 2、暂存区 暂存区是…

Docker Compose从入门到熟悉

一、DockerCompose是什么&#xff1f; Compose 项目是 Docker 官方的开源项目&#xff0c;负责实现对 Docker 容器集群的快速编排。使用前面介绍的Dockerfile我们很容易定义一个单独的应用容器。然而在日常开发工作中&#xff0c;经常会碰到需要多个容器相互配合来完成某项任务…

栈的应用——用栈实现算数混合运算表达式的计算

1、单目运算符双目运算符 算数运算符分为单目运算符和双目运算符等 单目运算符只需要一个操作数,双目运算符需要两个操作数 双目运算符最常见:常见的算术运算符:*/,比较运算符:<>=等等以下是一些单目运算符:正号 (+): 用于表示正数或给数值一个正号。例如:+5 仍然…

基于卷积神经网络的土豆疾病识别系统(pytorch框架)【python源码+UI界面+前端界面+功能源码详解】

功能演示&#xff1a; 土豆疾病识别系统&#xff0c;基于vgg16&#xff0c;resnet50卷积神经网络&#xff08;pytorch框架&#xff09;_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于卷积神经网络的土豆疾病识别系统是在pytorch框架下实现的&#xff0c;系统中有两…

Linux | MySQL基础

MySQL MySQL是关系型数据库&#xff08;RDBMS&#xff09;&#xff0c;采用表格结构存储数据 同类型的还有Oracle、SQL Server 主要特点 适用于中小规模、关系型数据库系统(RDBMS) 支持Linux、Unix、Windows等多种操作系统 支持Python、Java、Perl、PHP等编程语言 典型应…

计组第三版书例题

基础知识过一下 存储器与CPU的连接主要通过数据总线、地址总线和控制总线实现。CPU首先向存储器发送地址信号&#xff0c;然后发出读写控制信号&#xff0c;最后在数据总线上进行数据的读写操作 。这种连接方式确保了CPU能够正确地访问和控制存储器中的数据。 https://blog.cs…

树的基本概念与二叉树

文章目录 树的基本概念与二叉树一、树的概念和结构1. 树的概念2. 树的相关概念 二、树的存储1. 左孩子右兄弟表示法2. 双亲表示法 三、二叉树1. 特殊的二叉树1.1 满二叉树1.2 完全二叉树 树的基本概念与二叉树 一、树的概念和结构 1. 树的概念 树是一种非线性的数据结构,它是…

节点与其祖先之间的最大差值(DFS,Java)

题目描述&#xff1a; 给定二叉树的根节点 root&#xff0c;找出存在于 不同 节点 A 和 B 之间的最大值 V&#xff0c;其中 V |A.val - B.val|&#xff0c;且 A 是 B 的祖先。 &#xff08;如果 A 的任何子节点之一为 B&#xff0c;或者 A 的任何子节点是 B 的祖先&#xff…

【数据结构】--- 探索栈和队列的奥秘

关注小庄 顿顿解馋૮(˶ᵔ ᵕ ᵔ˶)ა &#x1f4a1;个人主页&#xff1a;9ilk &#x1f4a1;专栏&#xff1a;数据结构之旅 上回我们学习了顺序表和链表&#xff0c;今天博主来讲解两个新的数据结构 — 栈和队列 &#xff0c; 请放心食用 文章目录 &#x1f3e0; 栈&#x1…

【C++】二叉搜索数

目录 一、二叉搜索树的概念 二、二叉搜索树的模拟实现 1、定义节点 2、构造二叉树 3、析构二叉树 ​4、拷贝二叉树 5、二叉树赋值 6、插入节点 &#x1f31f;【非递归方式】 &#x1f31f;【递归方式】 7、打印节点 8、搜索节点 &#x1f31f;【非递归方式】 &…

我的需求分析方法论

或网上看了无数博客文章、技术视频&#xff0c;或购买金装版本技术书籍&#xff0c;看过无数原理原则、各种各样经典方法论&#xff0c;真正在实际开发工作中&#xff0c;本能去遵守和执行的又留下多少呢。 启动一个新系统时&#xff0c;我们可能还会去花些时间遵循这些原理原则…

中文大模型隐私保护哪家强?InternLM 与 Baichuan2 胜出!

引言&#xff1a;中文大模型隐私保护能力探索 本文研究了大语言模型&#xff08;LLMs&#xff09;对隐私和安全的影响&#xff0c;采用了三层渐进框架对语言系统的隐私进行评估。主要目标是全面评估LLMs对私人信息的敏感性&#xff0c;并检查其在识别、管理和保护敏感数据方面…