Vue入门到关门之组件

news2025/1/11 21:46:01

一、组件

1、什么是组件

在Vue.js中,组件是构建用户界面的可重用和独立的模块。每个Vue组件都封装了自己的模板、逻辑和样式,使得代码可以更加模块化、可维护性更高。通过组件化,你可以将界面拆分成独立的、可复用的部分,每个部分都有自己的功能和样式,这样可以更容易地管理复杂的界面,并且提高了代码的可读性和可维护性。

通俗来说,组件就是把一个很大的界面拆分为多个小的界面, 每一个小的界面就是一个组件,将大界面拆分成小界面就是组件化。而组件化开发指的就是根据封装的思想,把页面上可重用的 UI 结构封装为组件,从而方便项目的开发和维护。

在这里插入图片描述

2、组件的分类

  • 按作用范围分类
    • 全局组件:项目中所有地方都可以的组件称为全局组件
    • 局部组件(私有组件):仅有该组件才能使用的组件称为局部组件
  • 按照用途来分
    • 页面组件
    • 自定义组件

工程化开发之后:1个组件 就是1个xx.vue在vue 中规定:组件的后缀名是 .vue。之前接触到的 App.vue 文件本质上就是一个 vue 的组件。

以CSDN为例,如果使用组件化开发的话:

在这里插入图片描述

3、组件的内容

在Vue中,一个组件可以包括以下内容:

  1. **模板(Template):**定义了组件的结构和布局,使用HTML和Vue的模板语法来描述界面的外观。

  2. **脚本(Script):**包含了组件的逻辑,例如数据处理、事件处理、生命周期钩子等。通常使用JavaScript或TypeScript编写。

  3. **样式(Style):**定义了组件的样式,可以使用CSS、Sass、Less等来编写。

通过组件,你可以将页面划分成多个独立的部分,每个部分都有自己的功能和样式,并且可以在需要的地方进行重复使用。其中,每个组件中必须包含 template 模板结构,而 script 行为和 style 样式是可选的组成部分。

(1)template

  • 当前组件的DOM结构,需要定义到template标签的内部
template:`
  <div>
    <h1>{{ message }}</h1>
    <button @click="changeMessage">Change Message</button>
  </div>
`

注意:

  • template 是 vue 提供的容器标签,只起到包裹性质的作用,它不会被渲染为真正的 DOM 元素,后面的 v-slot 会使用到这个标签
  • template 中只能包含唯一的根节点

(2)script

  • 之后与组件相关的data数据、methods方法等,都需要定义到export default所导出的对象中
data() {
    return {
        message: 'Hello, Vue!'
    };
},
methods: {
    changeMessage() {
        this.message = 'Hello, World!';
    }
}

注意:

.vue 组件中的 data 必须是函数

vue 规定:.vue 组件中的 data 必须是一个函数,不能直接指向一个数据对象。

因此在组件中定义 data 数据节点时,下面的方式是错误的,但是在根组件这样写是可以的

data:{
    count:0
}

(3)style

  • 还是按照css的语法来写就好
<style>
h1 {
  color: blue;
}
</style>

总的来说,Vue组件是Vue.js框架中用于构建用户界面的独立模块,它们可以被组合和嵌套,从而构建出复杂的界面。

二、组件使用

1、全局组件

全局组件是在Vue应用程序中全局注册的组件,可以在应用的任何地方使用。一旦注册为全局组件,它就可以在整个应用程序中的任何Vue实例的模板中使用。

(1)注册全局组件

在Vue中,你可以使用Vue.component方法来注册全局组件。例如:

// 全局注册一个名为 'my-component' 的组件
Vue.component('my-component', {
  // ... 组件的选项
})

(2)使用全局组件

一旦注册为全局组件,你可以在任何Vue实例的模板中使用它:

<template>
  <div>
    <my-component></my-component>
  </div>
</template>

(3)完整示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./JS/vue.js"></script>

</head>
<body>
<div id="app">
    <h1>全局组件的使用</h1>
    <button @click="handleClick">点我</button>


    <hr>
    <xiao></xiao>
    <hr>
    <h1>我是全局组件</h1>
    <xiao></xiao>
</div>
</body>
<script>
    // 1、定义全局组件
    Vue.component('xiao', {
        template: `<div>
            <h1>{{ name }}</h1>
            <button @click="handleClick">点我换名字</button>
          </div>`,
        data() {
            return {
                name: 'xiao'
            }
        },
        methods: {
            handleClick() {
                this.name = '彭于晏'
            }
        }
    })
    
    var vm = new Vue({
        el: '#app',
        data: {},
        methods: {
            handleClick() {
                alert('美女吧')
            }
        }
    })
</script>
</html>

2、局部组件

局部组件是在Vue实例(或者其他组件)的组件选项中注册的组件。它只能在注册它的实例或者组件内部使用。

(1)注册局部组件

在Vue实例或者其他组件中,你可以通过components选项来注册局部组件。例如:

<template>
  <div>
    <my-local-component></my-local-component>
  </div>
</template>

<script>
// 通过ES6的import将自定义的组件引入进来
import MyLocalComponent from './MyLocalComponent.vue';

export default {
  // 注册组件
  components: {
    'my-local-component': MyLocalComponent
  }
}
</script>

(2)使用局部组件

一旦在实例或者组件中注册了局部组件,你可以在该实例或者组件的模板中使用它:

<template>
  <div>
    <my-local-component></my-local-component>
  </div>
</template>

(3)完整示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./JS/vue.js"></script>

</head>
<body>
<div id="app">
    <h1>局部组件的使用</h1>
    <button @click="handleClick">点我</button>
    <hr>
    <xiao></xiao>
</div>
</body>
<script>
    var xiao = {
        template: `
          <div>
            <h2>我是局部组件</h2>
          </div>
        `,
        data() {
            return {}
        },
        methods: {}
    }

    var vm = new Vue({
        el: '#app',
        data: {},
        methods: {
            handleClick() {
                alert('美女吧')
            }
        },
        components: {
            xiao:xiao
        }
    })
</script>
</html>

3、全局和局部混合使用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./JS/vue.js"></script>

</head>
<body>
<div id="app">
    <h1>局部组件的使用</h1>
    <button @click="handleClick">点我</button>

    <hr>
    <child></child>
</div>
</body>
<script>
    var xiao = {
        template: `
          <div>
            <h2>我是局部组件</h2>
          </div>
        `,
        data() {
            return {}
        },
        methods: {}
    }

    //  全局组件
    Vue.component('child', {
        template: `
          <div>
            <h1>我是全局组件</h1>
            <xiao></xiao>
            <xiao></xiao>
            <xiao></xiao>
          </div>
        `,
        // 局部组件
        components: {
            // 第一种方法
            // xiao: {
            //     template: `
            //       <div>
            //         <h2>我是局部组件</h2>
            //       </div>
            //     `,
            //     data() {
            //         return {}
            //     },
            //     methods: {}
            // }

            // 第二种方法
            xiao
        }
    })

    var vm = new Vue({
        el: '#app',
        data: {},
        methods: {
            handleClick() {
                alert('美女吧')
            }
        },
        components: {
            xiao
        }
    })
</script>
</html>

4、总结

  • 全局组件可以在整个应用程序中的任何地方使用,而局部组件只能在注册它的实例或者组件内部使用。
  • 全局组件适合用于在整个应用中频繁使用的通用组件,而局部组件适合用于特定页面或者组件内部的组件。
  • 全局组件的注册是通过Vue.component方法进行,而局部组件的注册是通过组件选项中的components属性进行。
  • 注意:组件中的数据,事件在没有额外参数的影响下都是独立的

了解elementui:

  • Element UI是一个基于Vue.js的组件库,提供了丰富的UI组件,如按钮、表格、弹窗等,可以帮助开发者快速构建美观、功能完善的前端界面。
  • 使用Element UI不仅可以减少开发工作量,而且它的组件都经过优化和测试,在性能和用户体验方面表现较好。
  • 通过引入Element UI的全局组件,开发者可以更加高效地开发出具有一致风格的界面。

三、组件间通信

在这里插入图片描述

1、父子通信之父传子-自定义属性

(1)父组件向子组件通信的步骤

  1. 在父组件中定义变量
data: {
    'url': './img/a.jpg'
}
  1. 把变量传递个子组件 ==> 自定义属性:myurl
<Child1 :myurl="url"></Child1>
  1. 在子组件中,拿到属性
props:['myurl']
  1. 以后在子组件中使用父组件的属性
this.myurl

(2)完整示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./JS/vue.js"></script>
    <script src="./JS/axios.js"></script>
</head>
<body>
<div id="app">
    <h1>组件间通信之父传子:自定义属性</h1>
    <h2>父组件中的名字{{myname}}</h2>
    <div style="background-color: pink">
        <child :name="myname" yy="xx"></child>
    </div>
</div>
</body>
<script>
    // 全局组件
    Vue.component('child', {
        template: `
          <div>
            <h2>我是child组件</h2>
            <h3>父组件传递给子组件的{{ name }}---{{ yy }}</h3>
          </div>`,
        data() {
            return {}
        },
        props: ['name', 'yy']
    })

    var vm = new Vue({
        el: '#app',
        data: {
            myname: '彭于晏'
        },
    })
</script>
</html>

运行结果:

在这里插入图片描述

2、父子通信之子传父—自定义事件

(1)子组件向父组件通信的步骤

  1. 在父组件中定义变量,用来接收子组件传入的变量
data: {
    text:''
},
  1. 在父组件使用子组件时候,自定义事件 myevent,名字随便取
<Child1 @myevent="handleMyEvent"></Child1>
  1. 在父组件中定义函数,跟自定义事件绑定
handleMyEvent(childText){
    this.text=childText
}
  1. 在子组件中 ==> 触发自定义事件执行
this.$emit('自定义事件名字',this.mytext)

(2)完整示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./JS/vue.js"></script>
    <script src="./JS/axios.js"></script>
</head>
<body>
<div id="app">
    <h1>组件间通信之子传父:自定义事件</h1>
    <h2>我是父组件</h2>
    子组件传给父组件的值===> {{p_name}}
    <hr>
    <div style="background-color:pink">
        <child @myevent="handleEvent"></child>
    </div>
</div>
</body>
<script>
    // 全局组件
    Vue.component('child', {
        template: `
          <div>
            <h2>我是child组件</h2>
            <input type="text" v-model="name">--> {{name}}
            <button @click="handleSend">传给父</button>
          </div>`,
        data() {
            return {
                name:''
            }
        },
        methods:{
            handleSend(){
                this.$emit('myevent',this.name)
            }
        }
    })

    var vm = new Vue({
        el: '#app',
        data: {
p_name:''
        },
        methods: {
            handleEvent(name){
                // name 是子组件中调用this.$emit('myevent',this.name)传过来的
                this.p_name = name
            }
        },
    })
</script>
</html>

运行结果:

在这里插入图片描述

3、ref属性(父子通信)

  • ref 是个属性, 如果在普通的DOM元素上,引用指向的就是该DOM元素;
  • 如果在子组件上,引用的指向就是子组件实例,然后父组件就可以通过 ref 主动获取子组件的属性或者调用子组件的方法

(1)放在普通标签上

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./JS/vue.js"></script>
    <script src="./JS/axios.js"></script>

</head>
<body>
<div id="app">
    <h2>ref属性放在普通标签上</h2>
    <input type="text" v-model="name" ref="myinput">
    <img src="./img/2.jpg" alt="" ref="myimg">
    <button @click="handleClick">点我执行代码</button>
</div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            name: ''
        },
        methods: {
            handleClick() {
                console.log(this.$refs)
                // 根据ref指定的名字,取出原生dom对象,然后就可以操作dom对象了
                var i = this.$refs['myinput']
                console.log(i)
                i.value = "你好"
                // 改图片
                var i = this.$refs['myimg']
                i.src = './img/3.jpg'
            }
        }
    })
</script>
</html>

(2)放在组件上

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./JS/vue.js"></script>
    <script src="./JS/axios.js"></script>
</head>
<body>
<div id="app">
    <div style="background-color: antiquewhite">
        <h2>ref属性放在组件上</h2>
        <child ref="mychild"></child>
    </div>
</div>
</body>
<script>
    // 定义全局组件
    Vue.component('child', {
        template: `
          <div>
            <img :src="url" alt="">
            <button @click="handleClick('子组件传入的')">点我弹窗</button>
          </div>
        `,
        data() {
            return {
                url: './img/1.jpg'
            }
        },
        methods: {
            handleClick(name) {
                alert(name)
            }
        },
    })

    var vm = new Vue({
        el: '#app',
        data: {
            name: ''
        },
        methods: {
            handleClick() {
                // 操作组件对象
                var i = this.$refs['mychild']
                console.log(i.url)
                // 改图片
                i.url = './img/4.jpg'
                // 改执行方法
                i.handleClick('xiao')

                // 子传父
                this.name = i.url
            }
        }
    })
</script>
</html>

四、动态组件

1、概念

动态组件就是允许你根据当前的数据来动态地切换显示不同的组件。

  • Vue内部提供的组件component组件作用是:实现动态的渲染组件,按需显示组件。

  • component 标签是 vue 内置的,作用:组件的占位符

  • 其中is 属性的值,表示要渲染的组件的名字

  • is 属性的值,应该是组件在 components 节点下的注册名称

2、完整示例

  • 比如我们这里有三个组件,需求:在app根组件中点击不同按钮可以按需显示组件。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./vue/vue.js"></script>
    <style>
        .item {
            width: 150px;
            height: 50px;
            background-color: pink;
            font-size: 25px;
            margin: 10px;
            display: flex;
            justify-content: center;
            align-items: center;
        }

        .top {
            display: flex;
            justify-content: center;
        }
    </style>
</head>
<body>
<div id="app">
    <h1>动态组件</h1>
    <div class="top">
        <div class="item" @click="current='goods'">
            <span>商品</span>
        </div>
        <div class="item" @click="current='order'">
            <span>订单</span>
        </div>
        <div class="item" @click="current='user'">
            <span>用户</span>
        </div>
    </div>
    <div>
<!--        不使用动态组件-->
<!--        <goods v-if="current=='goods'"></goods>-->
<!--        <order v-else-if="current=='order'"></order>-->
<!--        <user v-else></user>-->

<!--        使用动态组件-->
        <component :is="current"></component>
    </div>
</div>
</body>

<script>
    // 1 定义出 商品,订单,用户 三个组件
    Vue.component('goods', {
        template: `<div>
                        <h3>商品页面</h3>
                        商品列表
                        <br>
                        商品列表
                    </div>`,
    })

    Vue.component('order', {
        template: `<div>
                        <h3>订单页面</h3>
                        订单内容
                    </div>`,
    })

    Vue.component('user', {
        template: `<div>
                        <h3>用户页面</h3>
                        用户信息
                    </div>`,
    })

    var vm = new Vue({
        el: '#app',
        data: {
            current: 'goods'
        },
    })
</script>
</html>

3、内部组件keep-alive组件的使用

  • keep-alive 会把内部的组件进行缓存,而不是销毁组件;

  • 在使用 keep-alive 的时候,可以通过 include 指定哪些组件需要被缓存;

  • 或者,通过 exclude 属性指定哪些组件不需要被缓存;但是:不要同时使用 include 和 exclude 这两个属性

<keep-alive exclude="goods">
     <component :is="current"></component>
</keep-alive>

五、插槽

1、介绍

slot的官方定义是用于组件内容分发,简单通俗的解释就是在组件化开发中,虽然组件是一样的,但是在不同的使用场景,组件的某一部分需要有不同的内容显示。slot就好比组件开发时定义的一个参数,如果不传入值就当默认值使用,如果传入了新值,在组件调用时就会替换定义时的slot默认值。

一般情况下,编写完1个组件之后,组件的内容都是写死的,需要加数据 只能去组件中修改,扩展性很差。然后就出现了插槽这个概念,只需在组件中添加<slot></slot>,就可以在body的组件标签中添加内容。

2、匿名插槽

  • 匿名插槽插入不同的内容类似for循环一样,使用插槽一次就要全部再来一遍,例如下面使用了两个不同内容但是匿名插槽一样,所以会有两次完整的组件形成。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./JS/vue.js"></script>
    <script src="./JS/axios.js"></script>

</head>
<body>
<div id="app">
    <h1>插槽使用</h1>
    <div>
        <Home style="background-color:greenyellow">
            <div>
                <img src="./img/1.jpg" alt="">
            </div>
        </Home>
    </div>
    <hr>
    <div>
        <Home style="background-color:orange">
            <div>
                <img src="./img/2.jpg" alt="">
            </div>
        </Home>
    </div>
</div>
</body>
<script>

    var vm = new Vue({
        el: '#app',
        data: {
            who: 'Home'
        },
        components: {
            Home: {
                template: `<div>
                                <h3>我是首页</h3>
                                <slot></slot>
                                <h3>结束了</h3>
                        </div>`
            },
        }
    })
</script>
</html>

在这里插入图片描述

2、具名插槽

  • 在使用相同的具名插槽的时候,并没有再次形成完整的组件内容,而是将插槽里面的内容直接放到组件中对应插槽的位置
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./JS/vue.js"></script>
    <script src="./JS/axios.js"></script>
</head>
<body>
<div id="app">
    <h1>插槽使用</h1>
    <div>
        <Home style="background-color:greenyellow">
            <div slot="middle">
                <img src="./img/1.jpg" alt="">
            </div>
            <div slot="middle">
                <img src="./img/1.jpg" alt="">
            </div>
            <div slot="bottom">
                <a href="">点我看mm</a>
            </div>
        </Home>
    </div>
    <hr>
</div>
</body>
<script>

    var vm = new Vue({
        el: '#app',
        data: {
            who: 'Home'
        },
        components: {
            Home: {
                template: `<div>
                                <h3>我是首页</h3>
                                <slot name="middle"></slot>
                                <h3>结束了</h3>
                                <slot name="bottom"></slot>
                        </div>`
            },
        }
    })
</script>
</html>

在这里插入图片描述

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

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

相关文章

linux dma的使用

设备树配置 驱动代码 static void bcm2835_dma_init(struct spi_master *master, struct device *dev) { struct dma_slave_config slave_config; const __be32 *addr; dma_addr_t dma_reg_base; int ret; /* base address in dma-space */ addr of_get_address(master->de…

visionPro链接相机

搜索Cognex GigE Vision Configura… 修改子网掩码为255.255.255.0 配置驱动程序 更新驱动&#xff08;如果能够选择9014Bytes&#xff0c;跳过此步骤&#xff09; 更新更改 相机ip配置 打开visionPro 选择照相机 查看实时画面 运行保存图像

【C++】哈希表的底层逻辑

目录 一、哈希概念 1、哈希冲突 2、哈希冲突的解决 a、闭散列 &#x1f7e2;插入 &#x1f7e2;查找 &#x1f7e2;删除 &#x1f7e2;其他类型的数据 &#x1f7e2;实现 b、 开散列 &#x1f7e2;插入 &#x1f7e2;查找 &#x1f7e2;删除 &#x1f7e2;析构 &a…

RTMP 直播推流 Demo(一)—— 项目配置与视频预览

音视频编解码系列目录&#xff1a; Android 音视频基础知识 Android 音视频播放器 Demo&#xff08;一&#xff09;—— 视频解码与渲染 Android 音视频播放器 Demo&#xff08;二&#xff09;—— 音频解码与音视频同步 RTMP 直播推流 Demo&#xff08;一&#xff09;—— 项目…

ASR语音转录Prompt优化

ASR语音转录Prompt优化 一、前言 在ASR转录的时候&#xff0c;我们能很明显的感受到有时候语音识别不是很准确&#xff0c;这过程中常见的文本错误主要可以归纳为以下几类&#xff1a; 同音错误&#xff08;Homophone Errors&#xff09; 同音错误发生在不同词语发音相似或相…

javafx如何一键打包成exe

javafx如何打包成exe JavaFX-Template-Native 集成jfoenix、commons-math、commons-lang3、netty&#xff0c;方便一些和底层做通信使用&#xff0c;不需要可以自行pom中去掉依赖当前使用的jdk17&#xff0c;理论上jdk14都支持采用模块化&#xff0c;支持一键打包生成很小的ex…

远程桌面的端口配置与优化

在现代企业环境中&#xff0c;远程桌面连接已成为日常工作中不可或缺的一部分。然而&#xff0c;随着网络攻击的增加&#xff0c;确保远程桌面连接的安全性变得尤为重要。其中一个关键的安全因素是端口配置。 一、远程桌面默认端口 远程桌面协议&#xff08;RDP&#xff09;默…

深度学习之视觉特征提取器——LeNet

LeNet 引入 LeNet是是由深度学习巨头Yann LeCun在1998年提出&#xff0c;可以算作多层卷积网络在图像识别领域的首次成功应用。我们现在通常说的LeNet是指LeNet-5&#xff0c;最早的LeNet-1在1988年即开始研究&#xff0c;前后持续十年之久。但是&#xff0c;受限于当时计算机…

关于远程桌面与3389端口的深度解析

当我们谈论远程桌面和3389端口时&#xff0c;我们实际上是在探讨Windows操作系统的一个核心功能&#xff0c;该功能允许用户通过网络从任何地点远程控制和管理计算机。而3389端口&#xff0c;正是这一功能所依赖的通信端口。 一、远程桌面的工作原理 远程桌面协议&#xff08;R…

C++---重载

1、运算符重载 #include <iostream> using namespace std; class complex { int rel; int vir; public: complex(){} complex(int rel,int vir):rel(rel),vir(vir){} void show() { cout << rel << "" << vir << "i" <&l…

nodejs写接口(一)

一、新手上路十大步 &#xff08;1&#xff09;先建一个常用的文件夹 &#xff08;2&#xff09;使用code打开 &#xff08;3&#xff09;在里面新建一个index.js文件 &#xff08;4&#xff09;新建项目 npm init -y //用于自己搭建一个项目框架&#xff08;写框架&#xf…

STL复习

vector STL详解及常见面试题_stl常见面试题-CSDN博客 C vector中resize()和reserve()区别_c vector resize和reserve区别-CSDN博客 释放vectro内存&#xff1a; map释放内存 deque&#xff1a; C STL deque 容器底层实现原理&#xff08;深度剖析&#xff09; - 知乎 (zhihu.…

智能私信软件:转化率提升的神器

在数字化营销领域&#xff0c;利用智能私信软件策略提升转化率已经成为一种不可忽视的趋势。随着人工智能技术的发展&#xff0c;这些软件变得越来越智能&#xff0c;能够根据用户的行为和偏好提供个性化的沟通体验。在这篇文章中&#xff0c;我们将探讨如何有效地运用智能私信…

Opencv_14_多边形填充与绘制

绘制多边形&#xff1a; 1&#xff09;coInvert.polyline_drawing(src); 2&#xff09;void ColorInvert::polyline_drawing(Mat& image) { Mat canvas Mat::zeros(Size(512, 512), CV_8UC3); Point p1(100, 100); Point p2(150, 100); Point p3(200…

2000.1-2023.8中国经济政策不确定性指数数据(月度)

2000.1-2023.8中国经济政策不确定性指数数据&#xff08;月度&#xff09; 1、时间&#xff1a;2000.1-2023.8 2、指标&#xff1a;CNEPU&#xff08;经济政策不确定性指数&#xff09; 3、来源&#xff1a;China Economic Policy Uncertainty Index 4、用途&#xff1a;可…

公开课—京东生产环境海量数据架构优化实战

文章目录 读多写少——主库用来写&#xff0c;从库用来读单库的写压力太大——数据库的垂直和水平拆分分表怎么分呢&#xff1f;hash分表range分表多数据源操作与分布式事务问题 ShardingSphare分库分表&#xff08;京东开源&#xff09;关联查询怎么办&#xff1f;跨多个库&am…

CUDA的基础知识

文章目录 数据精度CUDA概念线程&线程块&线程网络&计算核心GPU规格参数内存 GPU并行方式数据并行流水并行张量并行混合专家系统 数据精度 FP32 是单精度浮点数&#xff0c;用8bit 表示指数&#xff0c;23bit 表示小数&#xff1b;FP16 是半精度浮点数&#xff0c;用…

【C++】封装哈希表 unordered_map和unordered_set容器

目录​​​​​​​ 一、unordered系列关联式容器 1、unordered_map 2、unordered_map的接口 3、unordered_set 二、哈希表的改造 三、哈希表的迭代器 1、const 迭代器 2、 operator 3、begin()/end() ​ 4、实现map[]运算符重载 四、封装 unordered_map 和 unordered_se…

ThinkPHP Lang多语言本地文件包含漏洞(QVD-2022-46174)漏洞复现

1 漏洞描述 ThinkPHP是一个在中国使用较多的PHP框架。在其6.0.13版本及以前&#xff0c;存在一处本地文件包含漏洞。当ThinkPHP开启了多语言功能时&#xff0c;攻击者可以通过lang参数和目录穿越实现文件包含&#xff0c;当存在其他扩展模块如 pear 扩展时&#xff0c;攻击者可…

【城市】2023香港身份与生活定居相关政策(IANG,优才/高才/专才,受养人/单程证)

【城市】2023香港身份与生活定居相关政策&#xff08;IANG&#xff0c;优才/高才/专才&#xff0c;受养人/单程证&#xff09; 文章目录 一、如何获得香港身份1、7年计划2、旅游签 二、港澳相关的证件类别1、HK证件2、CN证件 三、香港生活对比内地 本文仅代表2023年查阅相关资料…