Vue2 —— 学习(九)

目录

一、全局事件总线

(一)全局总线介绍

关系图

 对图中的中间商 x 的要求

1.所有组件都能看到

2.有 $on $off $emit

(二)案例

发送方 student

接收方

二、消息订阅和发布

(一)介绍

(二)使用消息订阅

(三)案例 

发送方语法

接收方语法

三、todoList 编辑功能

(一)MyItem 文件内容

(二)App 文件内容 

(三)$nextTick(function(){}) 

四、过度与动画

(一)用css动画写

(二)用过渡写

(三)设置多个标签动画

(四)使用成型的动画库

(五)总结

五、解决 ajax 请求跨域的问题

(一)复习

(二)跨域问题描述 

(三)跨域解决办法

1.cors

2.jsonp

3.代理服务器

介绍

构建代理服务器

方式一  简单的代理服务器

方式二 高级代理

(四)github 搜索案例

1.发送按钮组件

2.列表组件

3.app 组件


一、全局事件总线

(一)全局总线介绍

这是程序员们的经验

可以实现任意组件间的通信

关系图

就是使用 自定义事件 的方式来实现通讯

在接收方的身上经过 x 绑定自定义事件  然后传数据的人经过 x 来触发这个事件并传递数据 回调函数在接收方那里 就能把发送方的数据发送过去

 对图中的中间商 x 的要求
1.所有组件都能看到

x 得放到 vue 的 原型对象上, 就是 Vue.prototype.x = {a:1,b:2}

我们起名不叫 x 叫 $bus 为了迎合 Vue 的语法规则自己起的名 只是一个傀儡

写在 main.js  入口函数里面

安装 全局总线

import Vue from 'vue'
import App from './App.vue'Vue.config.productionTip = falsenew Vue({el: '#app',render: h => h(App),beforeCreate() {Vue.prototype.$bus = this}
})
2.有 $on $off $emit

这三个属性都在 Vue 的原型对象上

(二)案例

发送方 student
   <button @click="sendStudentName">把学生名给school</button>

使用 emit 触发我们绑定的事件 然后后面传入我们 想传的数据 

 methods: {sendStudentName(){this.$bus.$emit('hello',666)}},
接收方

最好一挂载就绑定 所以写在生命周期钩子 mounted 里面

 mounted(){this.$bus.$on('hello',(data)=>{console.log('我是 school 组件',data)})}

最好在后面加上一句这个 

beforeDestroy(){this.$bus.$off('hello')}

二、消息订阅和发布

(一)介绍

消息订阅,就是绑定我们能接收消息的名字 以后有人发送该名字的消息 我们能调用我们内部的函数接收到

发布消息,就是发布的内容

(二)使用消息订阅

原生的 js 没有消息订阅的功能 ,所以我们要下载第三方的库

我们使用 pubsub.js 库进行 sub 是 subscribe 订阅的意思 pub 就是 publish 发布的意思

先下载库 然后在 发送消息 接收消息的组件中 都要引入这个库 语法如下 

import pubsub from 'pubsub-js'

(三)案例 

发送方语法

点击按钮发送 hello 消息 内容是 666

   <button @click="sendStudentName">把学生名给school</button>
methods: {sendStudentName(){// this.x.$emit('hello',666)pubsub.publish('hello',666)}},
接收方语法

接收名字为 hello 的消息 并且执行回调函数

回调函数内部有两个参数 第一个是消息名 第二个是数据

最好写成箭头函数否则 this 的指向会出问题

mounted(){this.pid = pubsub.subscribe('hello',(message,data)=>{console.log('有人发布了hello 消息 回调执行了',message,data)})},

最后加上一句这个  

beforeDestroy(){// this.$bus.$off('hello')pubsub.unsubscribe('this.pubid')}

三、todoList 编辑功能

(一)MyItem 文件内容

在 Item 中 先写一个文本框 然后和前面的 span 用 v-show 方式 用里面的 todo.isEdit 数据来决定显示哪一个数据

      <span v-show="!todo.isEdit"> {{ todo.title }}</span>
 <inputv-show="todo.isEdit"type="text":value="todo.title"@blur="handleBlur(todo,$event)"ref="inputTitle"/>

用一个按钮 来触发编辑,里面调用 我们编辑的方法 handleEdit 并把 todo 传进去

<button v-show="!todo.isEdit" class="btn btn-edit" @click="handleEdit(todo)">编辑</button>

handleEdit 函数内容 我们要添加 isEdit 属性 先判断一下原先存不存在这个 属性 如果存在直接修改这个属性值即可,如果没有我们再添加

用 $set 方法添加 

 handleEdit(todo) {if (todo.hasOwnProperty("isEdit")) {todo.isEdit = true;} else {this.$set(todo, "isEdit", true);}},

当光标失去焦点时我们改变数据,通过全局总线 传数据 

handleBlur(todo,e) {todo.isEdit = false;if(!e.target.value.trim()) return alert('输入不能为空')this.$bus.$emit('updateTodo',todo.id,e.target.value)},

(二)App 文件内容 

 在 app 中绑定事件 然后 写回调函数

this.$bus.$on("updateTodo", this.updateTodo);

 回调函数修改 显示的数据

updateTodo(id, title) {this.todos.forEach((todo) => {if (todo.id === id) todo.title = title;});},

我们想点击编辑时就获得焦点 修改一下handle 函数

handleEdit(todo) {if (todo.hasOwnProperty("isEdit")) {todo.isEdit = true;} else {this.$set(todo, "isEdit", true);}setTimeout(() => {this.$refs.inputTitle.focus();},200);},

(三)$nextTick(function(){}) 

但是开发中更常用 $nextTick(function(){}) 下一次更新 dom 模板之后才执行

语法:this.$nextTick(回调函数) 

这样更改数据 模板重新解析 dom 元素,解析完毕调用函数 获得焦点

handleEdit(todo) {if (todo.hasOwnProperty("isEdit")) {todo.isEdit = true;} else {this.$set(todo, "isEdit", true);}// setTimeout(() => {//   this.$refs.inputTitle.focus();// },200);this.$nextTick(function(){this.$refs.inputTitle.focus();})},

四、过度与动画

transition 标签只能设置一个元素的动画 里面不能放两个标签 如果想给多个元素设置动画,就用transition-group

(一)用css动画写

先在 css 中写一个动画效果 进来和出来两个效果,分别写在 come 和 go 里面 

.come {animation: hahaha 1s;
}
.go {animation: hahaha 1s reverse;
}
@keyframes hahaha {from {transform: translateX(-100%);}to {trnasform: translateX(0px);}
}

然后 标签中调用动画效果

    <h1 v-show="isShow" class="go">你好啊!</h1>

我们可以通过 vue 来切换我们要使用的动画 不用自己写判断  什么时候调用什么动画

这一种过渡的效果 我们就能通过 transition(过渡) 标签来设置

在合适的时候加上 特定的类名就是特定的动画 come 就是来 go 就是去

 <transition name="hello" :appear="true"><h1 v-show="isShow">你好啊!</h1></transition>

transition 还能命名 但是css 中的效果对应也得修改 后面的 appear 属性 能让动画一开始就出来

前面的名字得改成一样的

.hello-enter-active {animation: hahaha 1s;
}
.hello-leave-active {animation: hahaha 1s reverse;
}

(二)用过渡写

.hello-enter 是进入的起点

hello-enter-to 是进入的终点

hello-leave 是退出的起点

hello-leave-to 是退出的终点

hello-enter-active 是进入过渡的效果

hello-leave- active 是离开的过渡效果

模板的内容和前面一样

<button @click="isShow = !isShow">显示隐藏</button><transition name="hello" :appear="true"><h1  v-show="isShow"> 你好啊!</h1></transition>

进入的起点

.hello-enter{transform: translateX(-100%);
}

进入的终点 

.hello-leave-to{transform: translateX(0);
}

离开的起点 离开的终点

.hello-leave{transform: translateX(0);
}
.hello-leave-to{transform: translateX(-100%);
}

因为离开的起点和离开的终点和前面开始一致 我们直接合在一块儿写,效果是一样的 并且能简化代码的结构

.hello-enter, .hello-leave-to{transform: translateX(-100%);
}
.hello-enter-to, .hello-leave{transform: translateX(0);
}

过渡的效果 可以单独写在

.hello-enter-active,
.hello-leave-active {transition: 0.5s;
}

(三)设置多个标签动画

transition-group

用到 transition-group 时 里面的标签需要给 key 值

<template><div><button @click="isShow = !isShow">显示隐藏</button><transition-group name="hello" :appear="true"><h1 v-show="isShow" key="1">你好啊!</h1><h1 v-show="isShow" key="2">你好啊!</h1></transition-group></div>
</template>

(四)使用成型的动画库

先用 npm 安装这个包 Animate.css

然后引入 import

import 'animate.css'

然后把网站中写好的类名 放到 name 中

然后再多加一个属性

enter-active-class=“” 进入的动画

leave-active-class=“" 退出的动画 

后面引号的内容直接去网站引入就行

 <transition-groupname="animate__animated animate__bounce":appear="true"enter-active-class="animate__swing"leave-active-class="animate__backOutRight">

(五)总结

当我们操纵 dom 元素时 在合适的时候 给元素添加样式类名

进入退出 都有三个状态

进入的起点 v-enter

进入的终点 v-enter-to

进入的总过程 v-enter-active

写法

如果用动画写直接用  v-enter-active  v-leave-active

如果不用的话 就得用  v-enter v-enter-to v-leave v-leave-to

transition 包含要过渡的元素,得配置 name 属性

多个元素时 得用 <transition-group> 并且里面的每一个元素都得有 key 值

五、解决 ajax 请求跨域的问题

vue-cli 开启 8080 服务器 支持脚手架的运行

(一)复习

复习 : 常用的发送 ajax 请求的方式有什么

1.xhr new (鼻祖 太老了 不用他)

XMLHttpRequest()

xhr.open() 配置请求信息

xhr.send() 真正发出去的请求

2.jQuery 

因为 xhr 太古老了 我们需要有人封装一下里面的方法 可以是公司的内部人员

也有现成的封装 就是 jQuery 封装过 xhr

$.get $post

3.axios

也是对 xhr 的封装

4.fetch

和 xhr 是平级的 都是在window 的内置对象上能直接使用

兼容性较差,ie 完全用不了 

所以建议使用 axios

(二)跨域问题描述 

先引入 axios

import axios from ‘axios’

然后写一个向服务器发送发送 ajax 请求的代码

<template><div><button  @click="getStudents">获得学生信息</button></div>
</template>
<script>
import axios from 'axios'
export default {name: "app",methods:{getStudents(){axios.get('http://localhost:5000/students').then(response => {console.log('请求成功了',response.data)},error => {console.log('请求失败',error.message)})}}
};
</script>

首先先开启我们的资源服务器 端口为 5000

然后启动 vue 脚手架,点击按钮发送 ajax 请求

发现报错 

发现关键词 cors 还有那个一长串的属性 这是我们之前学的 ajax 同源策略 的知识,现在我们的网站是 8080 端口而且是 http 协议 主机名是 localhost 

但是资源服务器 也是 http 协议 主机名也是 localhost 但是 端口号是 5000 和8080 不同不符合同源策略,所以报错 必须三个都相同才是 同源

浏览器成功发送请求了

资源服务器也接收服务器的请求了

我们服务器也接收到返回的资源了

但是我们的网站 发现端口号不太对 就不把资源给我们了,但是我们浏览器里面现在手里有资源

(三)跨域解决办法

1.cors

就是写服务器的人在 响应的时候加几个特殊的响应头

我们的网站成功发送请求了

资源服务器也接收请求了

我们网站也接收到返回的资源了 并且这个资源携带着特殊的响应头 我们网站一接收 发现这个响应头就明白我们要这个数据 就把数据给我们了 实现了跨域

特点:能解决跨域但是 容易任何人都能访问我们的资源服务器 获得资源不太好

需要后端写服务器的人员帮忙

2.jsonp

借助了script 标签里面的 src 属性 引入外部资源的时候不受同源策略的限制

使用的非常少 只能解决 get 请求的 跨域问题

需要前后端一块儿帮忙

3.代理服务器
介绍

代理服务器和我们网站所处在的位置相同

我们想向 资源服务器请求资源 我们先向代理服务器 发送请求

代理服务器再把请求转发给资源服务器

资源服务器把资源返回给代理服务器

代理服务器再把资源转发给我们 我们就收到数据了

粉色的是服务器 蓝色的也是服务器 服务器服务器之间 不用发送 ajax 就用原生的 http 协议即可

构建代理服务器

 1.使用 nignx 

后端了解一些再开启

2.使用 Vue 脚手架开启

方式一  简单的代理服务器

在vue.config.js 文件中编写代码

先在 vue-cli 的文档中 的配置项中 找到 devSever.proxy 后面的单词就是代理的意思

先把第一段代码沾到我们的文件的后面 开启代理服务器

端口号是我们要请求的服务器的端口号 不是8080 是 5000 后面不要写别的路径了

 devServer: {proxy: 'http://localhost:5000'}

然后 给我们 代码中的请求对象的端口也改成  8080 因为我们这回请求对象是代理服务器

<template><div><button  @click="getStudents">获得学生信息</button></div>
</template>
<script>
import axios from 'axios'
export default {name: "app",methods:{getStudents(){axios.get('http://localhost:8080/students').then(response => {console.log('请求成功了',response.data)},error => {console.log('请求失败',error.message)})}}
};
</script>

最后请求成功了

小问题:

8080 的根路径 在 public 文件夹中  里面的东西 跨=可以通过 localhost:8080/文件名的形式访问

如果 public 中 的文件出现了我们要请求的服务器中的文件名 我们就不会发送ajax 请求了而是直接把本地的东西拿来使用

比如上面的 students 如果我们本来就有就不发送请求了

而且 我们创建的代理服务器只能向一个资源服务器发送请求 不能向多个服务器发送请求

方式二 高级代理

里面有两段代码 第一段是完整代码 第二段是精简后的代码 我们先看前面的

就是我们的请求带着 这个信息我们就向代理发送请求 

/api 是请求前缀 代理服务器问我们 的 8080 我们本次请求的请求前缀是什么 如果是 /api 就走代理

target 就是我们要请求的目标  就是我们 url 地址  代理服务器把请求转发给这个地址

ws 是允许 websocket 通信

changeOrigin: true 是资源服务器 查看我们代理服务器位置时 代理服务器做出的应答,为真时 代理服务器就说我在 5000 其实在 8080 端口 ,如果时 false 就实话实说

 devServer: {proxy: {'/api': {target: '<url>',ws: true,changeOrigin: true},'/foo': {target: '<other_url>'}}}

初始化之后代码

devServer: {proxy: {'/daili': {target: 'http://localhost:5000',ws: true,changeOrigin: true},}
}

所以我们要使用这个代理服务器 我们得让我们原本的 请求地址带上请求前缀的信息,位置写在端口号的后面 后面的内容不用变化 还是 students

<template><div><button  @click="getStudents">获得学生信息</button></div>
</template>
<script>
import axios from 'axios'
export default {name: "app",methods:{getStudents(){axios.get('http://localhost:8080/daili/students').then(response => {console.log('请求成功了',response.data)},error => {console.log('请求失败',error.message)})}}
};
</script>

然后打开网页发送请求 出现 404 的错误 是因为我们的请求信息里面包含 /daili 我们代理服务器将请求转发时 把这个头前缀也转发了,但是资源服务器中没有 /daili 的路径,所以找不到信息报错

所以我们得把转发给资源服务器中的请求中的 /daili 去掉

我们得再加一个属性  pathRewrite:{'/^daili':' '} 匹配有 /daili 前缀的信息然后将这个信息 前缀转成空字符串 

 devServer: {proxy: {'/daili': {target: 'http://localhost:5000',pathRewrite:{'^/daili':''},ws: true,changeOrigin: true},}}

如果想向多个资源服务器发送请求 就复制一份 然后接着在 proxy 对象中写就行

 devServer: {proxy: {'/daili': {target: 'http://localhost:5000',pathRewrite:{'^/daili':''},ws: true,changeOrigin: true},'/demo': {target: 'http://localhost:5001',pathRewrite:{'^/demo':''},ws: true,changeOrigin: true},}}

注意:

由于我们这种写代理的方式 要加一个前缀,所以如果我们本地也有同名文件时 就强制去使用代理服务器 而不是直接使用我们本地的

我们还能通过这种方式实现 同时向多个服务器发送请求‘(能配置多个代理)

很好的解决了第一种方式的问题 

如果不想走代理不加前缀即可

(四)github 搜索案例

案例的网站已经解决了跨域的问题 用 cors

返回的数据 incomplete_results;false 说明发送的是不是完整的数据

item 是选出来的数据

第一个属性是 用户的头像 然后是每个人的 githbu 主页 地址

login 是用户的登录名

list 有四种展示 首先是刚进来的欢迎搜索

然后是 搜索时的加载中

然后是 搜索成功后的 用户信息

最后是 搜索请求出错时 的报错

代码结构

1.发送按钮组件
<template><section class="jumbotron"><h3 class="jumbotron-heading">Search Github Users</h3><div><inputtype="text"placeholder="enter the name you search"v-model="keyWord"/>&nbsp;<button @click="searchUsers">Search</button></div></section>
</template><script>
import axios from "axios";
export default {name: "Search",data() {return {keyWord: "",};},methods: {searchUsers() {this.$bus.$emit("updataListData", {isFirst: false,isLoading: true,errMsg: "",users: [],});axios.get(`https://api.github.com/search/users?q=${this.keyWord}`).then((response) => {console.log("请求成功了", response.data.items);this.$bus.$emit("getUsers", response.data.items);this.$bus.$emit("updataListData", {isLoading: false,errMsg: "",users: response.data.items,});},(error) => {console.log("请求失败了", error.message);this.$bus.$emit("updataListData", {isLoading: false,errMsg: error.message,users: [],});});},},
};
</script>
2.列表组件
<template><div class="row"><divv-show="info.users.length"class="card"v-for="user in info.users":key="user.login"><a :href="user.html_url" target="_blank"><img :src="user.avatar_url" style="width: 100px" /></a><p class="card-text">{{ user.login }}</p></div><h1 v-show="info.isFirst">欢迎使用!</h1><h1 v-show="info.isLoading">加载中。。。。</h1><h1 v-show="info.errMsg">{{info.errMsg}}</h1></div>
</template><script scoped>
export default {name: "List",data() {return {info: {isFirst: true,isLoading: false,errMsg: "",users: [],},};},mounted() {this.$bus.$on("updataListData", (dataObj) => {this.info = {...this.info,...dataObj}});},
};
</script><style>
.album {min-height: 50rem; /* Can be removed; just added for demo purposes */padding-top: 3rem;padding-bottom: 3rem;background-color: #f7f7f7;
}.card {float: left;width: 33.333%;padding: 0.75rem;margin-bottom: 2rem;border: 1px solid #efefef;text-align: center;
}.card > img {margin-bottom: 0.75rem;border-radius: 100px;
}.card-text {font-size: 85%;
}
</style>
3.app 组件
<template><div class="container"><Search /><List /></div>
</template>
<script>
import Search from "./components/Search";
import List from "./components/List";export default {name: "app",components: { Search, List },
};
</script>

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

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

相关文章

虚拟机中的打印机,无法打印内容,打印的是白纸或英文和数字,打印不了中文

原因&#xff1a;打印机驱动设置不正确 解决方案&#xff1a; 打开打印机属性 -> 高级 -> 新驱动程序 下一页 -> Windows 更新 耐心等待&#xff0c;时间较长。 选择和打印机型号匹配的驱动&#xff0c;我选择的是&#xff1a; 虽然虚拟机和主机使用的驱动不…

跨境电商指南:防关联浏览器和云主机有什么区别?

跨境电商的卖家分为独立站卖家和平台卖家。前者会自己开设独立站点&#xff0c;比如通过 shopify&#xff1b;后者则是入驻亚马逊或 Tiktok 等平台&#xff0c;开设商铺。其中平台卖家为了扩大收益&#xff0c;往往不止开一个店铺&#xff0c;或者有店铺代运营的供应商&#xf…

皇后之战:揭秘N皇后问题的多维解法与智慧【python 力扣52题】

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 python数据分析…

Go之map详解

map的结构 map实现的两个关键数据结构 hmap 定义了map的结构bmap 定义了hmap.buckets中每个bucket的结构 // A header for a Go map. type hmap struct {count int // 元素的个数flags uint8 // 状态标记&#xff0c;标记map当前状态&#xff0c;是否正在写入B …

css层叠性,继承性,优先级

前言 本文概要&#xff1a;讲述css的三大特性&#xff0c;层叠&#xff0c;继承和优先级。 层叠性 描述&#xff1a;我们试想以下这种情况&#xff1a;我们定义了同一个选择器&#xff0c;但是定义的属性不同。属性有相同的也有不同的&#xff0c;那么最后我们这个页面会听谁的…

CSS display属性

目录 概述&#xff1a; 设置display示例&#xff1a; none&#xff1a; block&#xff1a; inline&#xff1a; inline-block &#xff1a; 概述&#xff1a; 在CSS中我们可以使用display属性来控制元素的布局&#xff0c;我们可以通过display来设置元素的类型。 在不设置…

封装个js分页插件

// 分页插件类 class PaginationPlugin {constructor(fetchDataURL, options {}) {this.fetchDataURL fetchDataURL;this.options {containerId: options.containerId || paginationContainer,dataSizeAttr: options.dataSizeAttr || toatalsize, // 修改为实际API返回的数据…

ppt技巧:​如何将两个PPT幻灯片文件合并成一个?

第一种方式&#xff1a;复制粘贴幻灯片 1. 打开第一个PPT幻灯片文件&#xff0c;确保你已经熟悉该文件的内容和布局。 2. 打开第二个PPT幻灯片文件&#xff0c;浏览其中的所有幻灯片&#xff0c;选择你想要合并到第一个文件中的幻灯片。 3. 使用快捷键CtrlC&#xff08;Wind…

虚拟ip地址怎么弄到手机上

在当下的社会&#xff0c;手机已经变得至关重要&#xff0c;它融入了我们的日常生活&#xff0c;无论是上网冲浪、社交互动&#xff0c;还是工作学习&#xff0c;都离不开它。但有时候&#xff0c;由于某些限制&#xff0c;我们可能无法充分享受网络带来的便利。这时&#xff0…

Nginx part2.1

目录 搭建目录网页 为网页设置用户登录 做一个文件目录网页&#xff0c;并进行登陆 示范 搭建目录网页 启动nginx&#xff1a; systemctl start nginx 开机自启动nginx&#xff1a; systemctl enable nginx 启动完服务后&#xff0c;查看自己的nginx的状态&#xff1a;sys…

【JavaWeb】Day47.Mybatis基础操作——删除

Mybatis基础操作 需求 准备数据库表 emp 创建一个新的springboot工程&#xff0c;选择引入对应的起步依赖&#xff08;mybatis、mysql驱动、lombok&#xff09; application.properties中引入数据库连接信息 创建对应的实体类 Emp&#xff08;实体类属性采用驼峰命名&#xf…

【C++提高】常用容器

常用容器 引言&#xff1a;迭代器的使用一、vector容器1. vector基本概念2. vector的迭代器3. vector构造函数4. vector赋值操作5. vector容量和大小6. vector插入和删除7. vector数据存取8. vector互换容器9. vector预留空间 二、deque容器1. deque容器的基本概念2. deque容器…

python免费调用阿里云通义千问(q-wen-max)大模型API

文章目录 通义千问开通免费API Keypython调用阿里云通义千问API 通义千问 通义千问&#xff0c;是基于阿里巴巴达摩院在自然语言处理领域的研究和积累。采用更先进的算法和更优化的模型结构&#xff0c;能够更准确地理解和生成自然语言、代码、表格等文本。 支持更多定制化需…

HarmonyOs开发:导航tabs组件封装与使用

前言 主页的底部导航以及页面顶部的切换导航&#xff0c;无论哪个系统&#xff0c;哪个App&#xff0c;都是最常见的功能之一&#xff0c;虽然说在鸿蒙中有现成的组件tabs可以很快速的实现&#xff0c;但是在使用的时候&#xff0c;依然有几个潜在的问题存在&#xff0c;第一&a…

GRAF: Generative Radiance Fields for 3D-Aware Image Synthesis

GRAF: Generative Radiance Fieldsfor 3D-Aware Image Synthesis&#xff08;基于产生辐射场的三维图像合成&#xff09; 思维导图&#xff1a;https://blog.csdn.net/weixin_53765004/article/details/137944206?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3…

THREEJS 使用CatmullRomCurve3实现汽车模型沿着指定轨迹移动

效果预览 准备所需资源 搭建场景环境 const container document.querySelector("#box_bim");// 创建摄像机camera new THREE.PerspectiveCamera(50,window.innerWidth / window.innerHeight,0.1,1000);// camera.position.set(500, 500, 500);// 调整近裁减值camer…

深入剖析图像平滑与噪声滤波

噪声 在数字图像处理中&#xff0c;噪声是指在图像中引入的不希望的随机或无意义的信号。它是由于图像采集、传输、存储或处理过程中的各种因素引起的。 噪声会导致图像质量下降&#xff0c;使图像失真或降低细节的清晰度。它通常表现为图像中随机分布的亮度或颜色变化&#…

面试不慌张:一文读懂FactoryBean的实现原理

大家好&#xff0c;我是石头~ 在深入探讨Spring框架内部机制时&#xff0c;FactoryBean无疑是一个关键角色&#xff0c;也是面试中经常出现的熟悉面孔。 不同于普通Java Bean&#xff0c;FactoryBean是一种特殊的Bean类型&#xff0c;它的存在并非为了提供业务逻辑&#xff0c;…

基于Springboot的小区物业管理系统

基于SpringbootVue的小区物业管理系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 用户管理 员工管理 业主信息管理 费用信息管理 楼房信息管理 保修信息…

【原创教程】海为PLC与RS-WS-ETH-6传感器的MUDBUS_TCP通讯

一、关于RS-WS-ETH-6传感器的准备工作 要完成MODBUS_TCP通讯,我们必须要知道设备的IP地址如何分配,只有PLC和设备的IP在同一网段上,才能建立通讯。然后还要选择TCP的工作模式,来建立设备端和PC端的端口号。接下来了解设备的报文格式,方便之后发送报文完成数据交互。 1、…