vue学习 - 基础篇

news2024/11/17 13:48:32

初始工程结构

这里我们使用script标签从cdn获取vue.js, 而不是使用脚手架vue-cli, 因为cdn比较方便一点, 也不用配置node之类的比较麻烦

index.html

<!DOCTYPE html>
<html>

<head>
  <title>VueJS Course</title>
  <link rel="stylesheet" type="text/css" href="main.css" />
</head>

<body>
  <div id="app">
    <p>Hey</p>
  </div>
  <!-- vue cdn -->
  <script src="https://unpkg.com/vue@next"></script>
  <script src="app.js"></script>
</body>

</html>

app.js

Vue.createApp({})
    // 挂载vue到id=app的元素     .mount('#app')

main.css

body {
  font-size: 22px;
}

input[type="text"] {
  margin: 10px 0;
  display: block;
}

vue devtools 调试工具

在谷歌插件商店安装, 没有也没关系

为了我们打开html(cdn引入了vue)也能调试vue

在浏览器打开文件的方式(我们使用的是vscode)

#1 - 创建并挂载vue实例

createApp会创建一个vue实例, 它有一个mount方法可以将该实例挂载到指定的dom元素上, 该实例会解析这个dom元素的vue语法, 进行处理
// 创建实例 Vue.createApp({})
    // 挂载vue到id=app的元素     .mount('#app')

#2 - data: 定义数据 | 插值表达式

// 定义在vue实例外面的不会被vue实例识别并渲染 let lastName = 'abc'
Vue.createApp({
    // 定义数据     data() {
        return {
            firstName:'John'
        }
    }
})
    // 挂载vue到id=app的元素     .mount('#app')
在html里使用
<!DOCTYPE html>
<html>

<head>
  <title>VueJS Course</title>
  <link rel="stylesheet" type="text/css" href="main.css" />
</head>

<body>
  <!-- {{firstName}} -->
  <div id="app">
    <!-- 插值表达式,vue会运行里面的js表达式,并将结果渲染到页面 -->
    {{2+2}}
    <br />
    {{firstName}}
    <br />
    <!-- 没有定义在vue对象里 -->
    <!-- operty "lastName" was accessed during render but is not defined on instance. at <App> -->
    {{lastName}}
    <!-- error: avoid using JavaScript keyword as property name: "const" -->
    <!-- {{const a = 'foo'}} -->
  </div>
  <!-- vue cdn -->
  <script src="https://unpkg.com/vue@next"></script>
  <script src="app.js"></script>
</body>

</html>

#3 多个vue实例

同一个vue实例不能同时挂载到两个dom元素, 但是可以有多个vue实例, 分别挂载到不同的dom上
<!DOCTYPE html>
<html>

<head>
  <title>VueJS Course</title>
  <link rel="stylesheet" type="text/css" href="main.css" />
</head>

<body>
  <!-- {{firstName}} -->
  <div id="app">
    <!-- 插值表达式,vue会运行里面的js表达式,并将结果渲染到页面 -->
    {{2+2}}
    <br />
    {{firstName}}
    <br />
    <!-- 没有定义在vue对象里 -->
    <!-- operty "lastName" was accessed during render but is not defined on instance. at <App> -->
    {{lastName}}
    <!-- error: avoid using JavaScript keyword as property name: "const" -->
    <!-- {{const a = 'foo'}} -->
  </div>
  <!-- 无法同时挂载到多个对象 -->
  <div id="app">
    {{firstName}}
    <br />
  </div>
  <!-- 可以有多个vue实例,分别挂载不同对象 -->
  <div id="app2">
    {{firstName}}
    <br />
  </div>
  <!-- vue cdn -->
  <script src="https://unpkg.com/vue@next"></script>
  <script src="app.js"></script>
</body>

</html>
app.js
// let lastName = 'abc' Vue.createApp({
    // 定义数据     data() {
        return {
            firstName: 'John'
        }
    }
})
    // 挂载vue到id=app的元素     .mount('#app')
Vue.createApp({
    // 定义数据     data() {
        return {
            firstName: 'Bob'
        }
    }
})
    // 挂载vue到id=app2的元素     .mount('#app2')

#4 methods: 定义方法

<!DOCTYPE html>
<html>

<head>
  <title>VueJS Course</title>
  <link rel="stylesheet" type="text/css" href="main.css" />
</head>

<body>
  <div id="app">
    {{`${firstName} ${lastName.toUpperCase()}`}}
  </div>
  <!-- vue cdn -->
  <script src="https://unpkg.com/vue@next"></script>
  <script src="app.js"></script>
</body>

</html>
但是我们希望视图和逻辑分开, js写方法的具体逻辑, html里是样式和标签
我们定义一个函数, 放到vue实例的methods里, 然后在html里使用
const vm = Vue.createApp({
    // 定义数据     data() {
        return {
            firstName: 'John',
            lastName: 'Bob'
        }
    },
    methods: {
        fullName() {
            return `${this.firstName} ${this.lastName.toUpperCase()}`
        }
    },
})
    // 挂载vue到id=app的元素     .mount('#app')
在插值表达式里使用方法
<!DOCTYPE html>
<html>

<head>
  <title>VueJS Course</title>
  <link rel="stylesheet" type="text/css" href="main.css" />
</head>

<body>
  <div id="app">
    {{ fullName() }}
  </div>
  <!-- vue cdn -->
  <script src="https://unpkg.com/vue@next"></script>
  <script src="app.js"></script>
</body>

</html>

#5 v-cloak 实现渲染完再显示

先调整网速至低俗3G(按f12打开该界面)

此时刷新页面会发现, 插值表达式还在, 数据还没被渲染, 过了一会加载完成, 才渲染上数据

我们使用v-cloak来让加载时不出现这些vue语法
这个cloak在加载的时候会存在, 加载完成后会消失, 我们可以css选择clock, 让加载时cloak不显示页面元素, 等加载完移除cloak, 然后自动恢复元素显示
/* 加载时存在,加载并处理完成后变成data-v-app */
[v-cloak] {
  /* 实现加载时不出现插值表达式等模板语法,加载完直接显示结果 */
  display: none;
}

<!-- v-cloak,元素加载完成后会消失 -->
<div id="app" v-cloak>
  {{ fullName() }}
</div>

#6 v-model: 数据绑定

v-model 可以将input框的value和data里的数据绑定, 改变input的value, 也能同时改变data里对应的变量
<!DOCTYPE html>
<html>

<head>
  <title>VueJS Course</title>
  <link rel="stylesheet" type="text/css" href="main.css" />
</head>

<body> 
  <div id="app" v-cloak>
    <p>{{ fullName() }}</p>
    <hr>
    <label>First Name</label>
    <!-- 响应式Reactivity --> 
    <input type="text" v-model="firstName">
    <label>Last Name</label>
    <input type="text" v-model="lastName">
  </div>
  <!-- vue cdn -->
  <script src="https://unpkg.com/vue@next"></script>
  <script src="app.js"></script>
</body>

</html>

其实v-model是v-bind和@input的语法糖

#7 v-bind 绑定data里的变量到dom元素的属性上

<p><a v-bind:href="url" target="_blank">bing</a></p>
<!-- 简写 -->
<p><a :href="url" target="_blank">bing</a></p>

const vm = Vue.createApp({
    // 定义数据     data() {
        return { 
            url: 'https://bing.com'
        }
    }, 
})
    // 挂载vue到id=app的元素     .mount('#app')

#8 v-html: 渲染富文本

<p v-html="raw_url"></p>

const vm = Vue.createApp({
    // 定义数据     data() {
        return { 
            raw_url: '<p><a href="https://bing.com" target="_blank">bing</a></p>'
        }
    }, 
})
    // 挂载vue到id=app的元素     .mount('#app')

#9 事件监听

我们用 v-on 或简写 @事件名 来监听事件
<label>Last Name</label>
<!-- <input type="text" v-model="lastName"> -->
<!-- 监听input事件 -->
<input type="text" :value="lastName" @input="updateLastName">
<hr>
<p>{{age}}</p>
<!-- 监听事件 -->
<button v-on:click="increment">Increment</button>
<button @click="age--">Decrement</button>

const vm = Vue.createApp({
    // 定义数据     data() {
        return { 
            lastName: 'Bob', 
            age: 20
        }
    },
    methods: { 
        increment() {
            this.age++
        },
        updateLastName(e) {
            this.lastName = e.target.value
        }
    },
})
    // 挂载vue到id=app的元素     .mount('#app')

#10 (调用函数时)传递事件对象 event

向方法传递参数时,如果想传递自定义参数,又想获取事件对象e,需要手动传递$event
<input type="text" :value="lastName" @input="updateLastName('update lastname',$event)">

const vm = Vue.createApp({
    // 定义数据     data() {
        return { 
            lastName: 'Bob', 
        }
    },
    methods: { 
        updateLastName(msg, e) {
            e.preventDefault()
            console.log(msg);
            this.lastName = e.target.value
        }
    },
})
    // 挂载vue到id=app的元素     .mount('#app') 

#11 事件修饰符

事件修饰符,简化像e.preventDefault这种操作, 被加上了.xxx的方法, 会执行对应的js

<input type="text" :value="lastName" @input.prevent="updateLastName('update lastname',$event)">

const vm = Vue.createApp({
    // 定义数据     data() {
        return { 
            lastName: 'Bob', 
        }
    },
    methods: { 
        updateLastName(msg, e) {
            // 加了.prevent, 不需要再加这句             // e.preventDefault()             console.log(msg);
            this.lastName = e.target.value
        }
    },
})
    // 挂载vue到id=app的元素     .mount('#app') 

#12 keyboard 键盘修饰符

<label>Middle Name</label>
<!-- 按下enter触发 -->
<input type="text" @keyup.enter="updateMiddleName">
<!-- 点击按钮+ctrl键才能触发 -->
<button @click.ctrl="...">Decrement</button>

const vm = Vue.createApp({
    // 定义数据     data() {
        return { 
            middleName: '',  
        }
    },
    methods: { 
        updateMiddleName(e) {
            this.middleName = e.target.value
        }
    },
})
    // 挂载vue到id=app的元素     .mount('#app')

#13 v-model的事件修饰符

<!-- 在输入框中,v-model 默认是同步数据,使用 .lazy 会转变为在 change 事件中同步  也就是在失去焦点 或者 按下回车键时才更新** -->
<input type="text" v-model.lazy.trim="firstName"> 
<!-- input框输入数字时,转为number类型,如果没有.number,则依然是string -->
<input type="text" v-model.number="age">

#14 Computed Properties 计算属性

如果在method里计算fullname,则当其他data的数据更新时,fullname也会被重新计算,因为每次更新数据,vue都会重新渲染数据到页面上,则会调用所有method方法(由事件触发的方法不会),所以,我们需要计算属性来让方法在需要时才被调用
const vm = Vue.createApp({
    // 定义数据     data() {
        return {
            firstName: 'John',
            middleName: '',
            lastName: 'Bob', 
        }
    },
    methods: { 
        fullName() {
            console.log(1);
            return `${this.firstName} ${this.middleName} ${this.lastName.toUpperCase()}`
        }, 
    },
})
    // 挂载vue到id=app的元素     .mount('#app') 

<!DOCTYPE html>
<html>

<head>
  <title>VueJS Course</title>
  <link rel="stylesheet" type="text/css" href="main.css" />
</head>

<body>
  <div id="app" v-cloak>
    {{fullName()}}
    <div @click="age++">
      {{age}}
    </div>
  </div>
  <!-- vue cdn -->
  <script src="https://unpkg.com/vue@next"></script>
  <script src="app.js"></script>
</body>

</html>

一直点击div, 更新age, 触发视图更新, 此时可以看到触发了很多次的fullname方法

只有和计算属性关联的值的更新,才会触发计算属性的更新
const vm = Vue.createApp({
    // 定义数据     data() {
        return {
            firstName: 'John',
            middleName: '',
            lastName: 'Bob',
            age:20
        }
    },
    // 计算属性     computed: {
        fullName() {
            console.log(1);
            return `${this.firstName} ${this.middleName} ${this.lastName.toUpperCase()}`
        },
    },
})
    // 挂载vue到id=app的元素     .mount('#app') 

#15 watch 监听

监听值的更新,用得比较少
const vm = Vue.createApp({
    // 定义数据     data() {
        return { 
            age: 20
        }
    }, 
    // watch可以执行异步任务     watch: {
        age(newval, oldval) {
            setTimeout(() => {
                this.age = 100
            }, 2000);
        }
    }
})
    // 挂载vue到id=app的元素     .mount('#app')

#16 动态绑定class

 body{
 font-size: 20px;
 font-family: sans-serif;
}
label{
 margin-bottom: 20px;
 font-size: 20px;
 display: block;
}
select{
 font-size: 20px;
 margin-bottom: 20px;
}
input[type=number]{
 display: block;
 font-size: 20px;
 margin-bottom: 20px;
}
.circle{
 width: 150px;
 height: 150px;
 border-radius: 100%;
 background-color: #45D619;
 text-align: center;
 color: #fff;
 line-height: 150px;
 font-size: 32px;
 font-weight: bold;
}

.purple{
 background-color: #767DEA;
}
.text-black{
 color: #424242;
}
.text-orange{
 color: #FFC26F;
}

<!DOCTYPE>
<html>

<head>
 <title>VueJS Course</title>
 <link rel="stylesheet" type="text/css" href="main.css" />
</head>

<body>
 <div id="app">
 <label>
 <input type="checkbox" v-model="isPurple" /> Purple
 </label>

 <div class="circle" :class="{purple: isPurple}">
      Hi!
 </div>
 </div>

 <script src="https://unpkg.com/vue@next"></script>
 <script src="app.js"></script>
</body>

</html>

let vm = Vue.createApp({
    data() {
 return { isPurple: false }
    }
}).mount('#app')
当需要多个class时,这种写法会很乱,所以我们把它移到计算属性去
<!DOCTYPE>
<html>

<head>
  <title>VueJS Course</title>
  <link rel="stylesheet" type="text/css" href="main.css" />
</head>

<body>
  <div id="app">
    <label>
      <input type="checkbox" v-model="isPurple" /> Purple
    </label>
    <select v-model="selectedColor">
      <option value="">white</option>
      <option value="text-black">black</option>
      <option value="text-orange">orange</option>
    </select>
    <!-- 添加多个class: 传递数组 -->
    <div class="circle" :class="[circle_classes,selectedColor]">
      Hi!
    </div>
  </div>

  <script src="https://unpkg.com/vue@next"></script>
  <script src="app.js"></script>
</body>

</html>

let vm = Vue.createApp({
    data() {
        return { isPurple: false, selectedColor: '' }
    },
    computed: {
        // 计算多个class         circle_classes() {
            return { purple: this.isPurple }
        }
    }
}).mount('#app')

#17 绑定style

<input type="number" v-model="size" />  
<div class="circle" :class="[circle_classes,selectedColor]"
  :style="[{width:size+'px',height:size+'px',lineHeight: size+'px'},{transform: 'rotate(30deg)'}]">
  Hi!
</div>
<!-- 可以多个style对象 -->
<div class="circle" :class="[circle_classes,selectedColor]"
  :style="{width:size+'px',height:size+'px',lineHeight: size+'px'}">
  Hi!
</div>

let vm = Vue.createApp({
    data() {
        return { size: 150 }
    }, 
}).mount('#app')

#18 条件渲染

<!DOCTYPE>
<html>

<head>
  <title>VueJS Course</title>
  <link rel="stylesheet" type="text/css" href="main.css" />
</head>

<body>
  <div id="app">
    <!-- 这些v-if的元素必须在同一个层级 -->
    <p v-if="mode==1">showing v-if directive content</p>
    <!-- template是vue提供的标签,类似<></>,不会渲染为html元素 -->
    <template v-else-if="mode==2">
      <p>v-else-if</p>
      <div>hello</div>
    </template>
    <p v-else>v-else</p>

    <!-- 这个要放在vue实例挂载的元素里v-model才能生效 -->
    <select v-model="mode">
      <option value="1">v-if</option>
      <option value="2">v-else-if</option>
      <option value="3">v-else</option>
    </select>
  </div>
  <script src="https://unpkg.com/vue@next"></script>
  <script src="app.js"></script>
</body>

</html>

const vm = Vue.createApp({
    // 定义数据     data() {
        return { 
            moed:1
        }
    }, 
})
    // 挂载vue到id=app的元素     .mount('#app') 

#19 v-show

<!-- v-if是替换,v-show是设置display -->
<!-- v-show不能使用v-else和template标签 -->
<!-- v-show的性能更好 -->
<i v-show="mode==1">v-show</i>

#20 循环渲染

let vm = Vue.createApp({
    data() {
        return {
            birds: ['Pigeons', 'Eagles', 'Doves', 'Parrots'],
            people: [
                { name: 'John', age: 20 },
                { name: 'Rick', age: 18 },
                { name: 'Amy', age: 33 }
            ]
        }
    }
}).mount('#app');

<!DOCTYPE>
<html>

<head>
  <title>VueJS Course</title>
  <link rel="stylesheet" type="text/css" href="main.css" />
</head>

<body>
  <div id="app">
    <!-- 遍历数组 -->
    <ul>
      <!-- 第二个参数是索引下标 -->
      <li v-for="(bird,index) in birds" :key="bird">
        {{bird}}-{{index}}
      </li>
    </ul>
    <hr>
    <!-- 遍历对象数组 -->
    <ul>
      <!-- <li v-for="person in people">  <div>{{person.age}}</div>  <div>{{person.name}}</div>  </li> -->
      <li v-for="person in people">
        <!-- 遍历对象 -->
        <div v-for="(value,key,index) in person">
          index:{{index}} - {{key}} : {{ value }}
        </div>
      </li>
    </ul> 
  </div>

  <script src="https://unpkg.com/vue@next"></script>
  <script src="app.js"></script>
</body>

</html>

#21 key的作用

let vm = Vue.createApp({
  data() {
    return {
      people: [
        {
          name: 'John',
          message: 'Hello world!'
        },
        {
          name: 'Rick',
          message: 'I like pie.'
        },
        {
          name: 'Amy',
          message: 'Skydiving is fun!'
        }
      ]
    }
  },
  methods: {
    move() {
      const first = this.people.shift()

      this.people.push(first)
    }
  }
}).mount('#app')

<!DOCTYPE>
<html>

<head>
  <title>VueJS Course</title>
  <link rel="stylesheet" type="text/css" href="main.css" />
</head>

<body>
  <div id="app">
    <button type="button" class="move" @click="move">
      Move to Bottom
    </button>
    <!-- 不加key,则input不动 -->
    <!-- 加key,强制元素移动,但是性能开销大 -->
    <div class="card" v-for="person in people" :key="person.name">
      <h3>{{ person.name }}</h3>
      <p>{{ person.message }}</p>
      <input type="text" />
    </div>
  </div>

  <script src="https://unpkg.com/vue@next"></script>
  <script src="app.js"></script>
</body>

</html>

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

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

相关文章

第三篇、基于Arduino uno,用oled0.96寸屏幕显示dht11温湿度传感器的温度和湿度信息——结果导向

0、结果 说明&#xff1a;先来看看拍摄的显示结果&#xff0c;如果是你想要的&#xff0c;可以接着往下看。 1、外观 说明&#xff1a;本次使用的oled是0.96寸的&#xff0c;别的规格的屏幕不一定适用本教程&#xff0c;一般而言有显示白色、蓝色和蓝黄一起显示的&#xff0…

RabbitMQ日常使用小结

一、使用场景 削峰、解耦、异步。 基于AMQP(高级消息队列协议)协议来统一数据交互,通过channel(网络信道)传递信息。erlang语言开发&#xff0c;并发量12000&#xff0c;支持持久化&#xff0c;稳定性好&#xff0c;集群不支持动态扩展。 RabbitMQ的基本概念 二、组成及工作流…

可见性原子性有序性的+线程传参的方式+Java如何实现多个线程之间共享数据+线程间通信+死锁产生

//为了均衡CPU和内存的速度差异,增加了缓存 导致了可见性的问题; //操作系统增加了进程 线程 分时复用CPU,均衡CPU和io设备的速速差异 导致了原子性问题; //jvm指令重排序(优化指令排序) 导致了有序性的问题 可见性问题是指 线程A修改共享变量,修改后CPU缓存中的数据没有及时同…

Emacs之目前最快补全插件lsp-bridge(八十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

数据分析12——Pandas中数据合并方法

0、前言&#xff1a; 在pandas中进行数据合并的操作和数据库中的join操作非常类似。 1、merge横向合并&#xff1a; 前言&#xff1a;该函数只能做横向合并函数名&#xff1a;merge()函数参数&#xff1a; left: 数据类型为’DataFrame | Series’&#xff0c;需要进行合并的…

[CTF/网络安全] 攻防世界 PHP2 解题详析

[CTF/网络安全] 攻防世界 PHP2 解题详析 index.php.phps扩展名姿势 翻译&#xff1a;你能给这个网站进行身份验证吗&#xff1f; index.php index.php是一个常见的文件名&#xff0c;通常用于Web服务器中的网站根目录下。它是默认的主页文件名&#xff0c;在访问一个网站时&am…

说说计算这事儿:从开关到人工智能

目录 一 前言 二 计算历史 三 计算探秘 四 算力优化 五 未来展望 一 前言 计算本身其实是一个比较抽象的词&#xff0c;或者说比较笼统。很多场景都可能用到计算这个词&#xff0c;因此具体的含义就需要根据上下文来确定。今天我们讨论的计算&#xff0c;是比较狭义的计算…

【环境准备】在虚拟机的Ubuntu下安装VS Code并配置C/C++运行环境

1.点击进入 vscode官网 下载.deb安装包 2.启动虚拟机下的Ubuntu&#xff0c;Windows下的Xftp和Xshell Xftp&#xff1a;用于将刚刚在Windows下下载好的vscode.deb安装包传输到Ununtu中。Xshell&#xff1a;用于远程登录Ununtu&#xff0c;进行 vscode.deb 安装包安装&#xff…

算法26:递归练习

目录 题目1&#xff1a;给你一个字符串&#xff0c;要求打印打印出这个字符串的全部子序列&#xff08;子序列不能重复&#xff09; 题目2&#xff1a;打印一个字符串的全部排列。 题目3&#xff1a;针对题目2&#xff0c;要求去除重复元素 题目4&#xff1a;给定一个字符串…

ARM的读写内存指令与栈的应用

1.基础读写指令 写内存指令&#xff1a;STR MOV R1, #0xFF000000 MOV R2, #0x40000000 STR R1, [R2] 将R1寄存器中的数据写入到R2指向的内存空间 需注意&#xff0c;此命令是将R1中的数据写给R2所指向的内存空间&#xff0c;而不是直接把R1的数据赋给R2&#xff0c;R2寄存器…

chatgpt赋能Python-python3_9如何安装

Python 3.9 安装教程 Python 是一款非常流行的编程语言&#xff0c;而 Python 3.9 是其中的最新版本。不过&#xff0c;有些人可能会遇到一些问题&#xff0c;因为这是一个新版本。在本篇文章中&#xff0c;我们将介绍 Python 3.9 的安装过程&#xff0c;并提供一些关键的步骤…

无线通信网 - 动态主机配置协议 DHCP

文章目录 1 概述2 DHCP2.1 工作原理2.2 报文类型 3 扩展3.1 网工软考真题 1 概述 #mermaid-svg-VTnvU3Vd01Y4gppz {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-VTnvU3Vd01Y4gppz .error-icon{fill:#552222;}#merm…

[CTF/网络安全] 攻防世界 Training-WWW-Robots 解题详析

[网络安全] 攻防世界 Training-WWW-Robots 解题详析 在这个小训练挑战中&#xff0c;你将学习 Robots_exclusion_standard&#xff08;机器人排除标准&#xff09;。 robots.txt 文件是由网络爬虫用来检查是否允许他们爬行和索引你的网站或仅部分内容。有时这些文件揭示目录结构…

Vivado HLS 第1讲 软件工程师该怎么了解FPGA架构

Vivado HLS是将基于C/C++描述的算法转化成相应的RTL代码,最终在FPGA上实现。这就要求软件工程师对FPGA的内部架构有一些基本的认识,目的在于保证生成的RTL代码在性能和资源上能够达到很好的平衡。实际上,C语言与FPGA是有一些对应关系的。比如: C语言中的数组可对应于FPGA中…

直方图与直方图均衡化

直方图 图像直方图是用来表现图像中亮度分布的直方图&#xff0c;给出的是图像中某个亮度或者某个范围亮度下共有几个像素&#xff0c;即统计一幅图某个亮度像素数量。 直方图作为一种简单有效的基于统计特性的特征描述子&#xff0c;在计算机视觉领域广泛使用。 它的优点主要…

上下文无关文法、句柄、正规文法、规范推导、文法二义性

目录 上下文无关文法 句柄 正规文法 规范推导 文法二义性 上下文无关文法 上下文无关文法&#xff08;Context-Free Grammar&#xff0c;CFG&#xff09;是一种形式语言&#xff0c;用于描述一类语言的语法结构。它由一组产生式规则组成&#xff0c;每个规则定义了如何将一…

hackthebox htb interface:CVE-2022-28368

本题考察:CVE-2022-28368 CVE-2022-28368 - 通过远程 CSS 字体缓存安装的 RCE 参考: https://www.0le.cn/archives/58.htmlhackthebox-interface信息搜集nmap扫描端口发现开放的22和80PORT STATE SERVICE REASON22/tcp open ssh syn-ac...https://www.0le.cn/archives/58.htm…

Spring 经典面试题总结

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

learn_C_deep_12 (深度理解“取整“、“取余“、“取模“运算、掌握运算符优先级 )

目录 关于“取整” "取整"规则 1、向零取整 2、向-∞取整 3、向∞取整 4、四舍五入 关于"取模和取余" 运算符优先级 关于“取整” #include <stdio.h> int main() {//本质是向0取整int i -2.9;int j 2.9;printf("%d\n", i); /…

【C++】 排列与组合算法详解(进阶篇)

文章目录 写在前面算法1&#xff1a;朴素算法思路缺点 算法2&#xff1a;递推预处理思路时间复杂度&#xff1a; O ( n 2 ) O(n^2) O(n2) 算法3&#xff1a;阶乘逆元思路时间复杂度&#xff1a; O ( n log ⁡ n ) O(n \log n) O(nlogn)思考&#xff1a;读者也可以尝试写 O ( n…