Vue2脚手架创建项目

一、使用脚手架

1.安装 @vue/cli

​ 简述 cli ===> command line interface (命令行接口)

// 安装npm install -g @vue/cli# ORyarn global add @vue/cli// 升级npm update -g @vue/cli# ORyarn global upgrade --latest @vue/cli// 版本查看 vue --version    或 vue -V

2…使用@vue/cli创建项目

// 创建项目
vue create hello-world

项目结构:

运行命名可查看具体的webpack配置: vue inspect > output.js

├── public
│ ├── favicon.ico: 页签图标
│ └── index.html: 主页面
├── src
│ ├── assets: 存放静态资源
│ │ └── logo.png
│ │── component: 存放组件
│ │ └── HelloWorld.vue
│ │── App.vue: 汇总所有组件
│ │── main.js: 入口文件
├── .gitignore: git 版本管制忽略的配置
├── babel.config.js: babel 的配置文件
├── package.json: 应用包配置文件
├── README.md: 应用描述文件
├── package-lock.json:包版本控制文件

index.html文件解释

<!DOCTYPE html>
<html lang=""><head><meta charset="utf-8"><!-- 针对IE浏览器的一个特殊配置,让IE浏览器一最高的渲染级别渲染也页面,因为 Vue 不支持 IE8 及以下版本 --><meta http-equiv="X-UA-Compatible" content="IE=edge"><!-- 开启移动端的理想视口 --><meta name="viewport" content="width=device-width,initial-scale=1.0"><!-- <%= BASE_URL %> 永远指向 public 文夹下的目录 --><link rel="icon" href="<%= BASE_URL %>favicon.ico"><!-- 使用package.json中的配置,配置标题 --><title><%= htmlWebpackPlugin.options.title %></title></head><body><!-- 当浏览器不支持js时,渲染soscript标签中的内容 --><noscript><strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><!-- built files will be auto injected --></body>
</html>

3.render配置项

import Vue from 'vue'
import App from './App.vue'// 关闭Vue的生产提示
Vue.config.productionTip = falsenew Vue({// 将 App组件渲染到容器中// render: h => h(App),components:{App},template:`<App />`// 这里不使用render函数会报错
}).$mount('#root')

不使用render函数报错:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jwArkaM1-1649689289671)(D:\Users\小江\Desktop\md_imgs\no_render_error.png)]

解决该问题:

方法一:引入完整版Vue

import Vue from 'vue/dist/vue'    //完整版Vue
import App from './App.vue'new Vue({components:{App},template:`<App />`
}).$mount('#root')

方法二:使用render函数

import Vue from 'vue'
import App from './App.vue'new Vue({// 将 App组件渲染到容器中 render函数(必须有返回值)返回一个虚拟节点 // 然后将返回的虚拟节点渲染到到页面// render(createElement){//   return createElement('h1','你好啊')// }// 简写render:h=>h(App)}).$mount('#root')

createElement函数参数说明(摘自官网):

// @returns {VNode}
createElement(// {String | Object | Function}// 一个 HTML 标签名、组件选项对象,或者// resolve 了上述任何一种的一个 async 函数。必填项。'div',// {Object}// 一个与模板中 attribute 对应的数据对象。可选。{// 与 `v-bind:class` 的 API 相同,// 接受一个字符串、对象或字符串和对象组成的数组'class': {foo: true,bar: false},// 与 `v-bind:style` 的 API 相同,// 接受一个字符串、对象,或对象组成的数组style: {color: 'red',fontSize: '14px'}...},// {String | Array}// 子级虚拟节点 (VNodes),由 `createElement()` 构建而成,// 也可以使用字符串来生成“文本虚拟节点”。可选。['先写一些文字',createElement('h1', '一则头条'),createElement(MyComponent, {props: {someProp: 'foobar'}})]
)

不同版本的Vue

1.   vue.js与vue.runtime.xxx.js的区别:(1) vue.js时完整版的vue,包含核心功能 + 模板解析器(2) vue.runtime.xxx.js时运行版的vue,只包含核心功能,没有模板解析器
2.  因为这里使用的是vue.runtime.js,没有模板解析器,所以不能使用template配置项,需要使用render函数接收到的createElement函        数去指定具体内容

4.修改默认配置

与package.json同级目录下新建vue.config.js配置文件,具体配置参考 [vue.config.js](配置参考 | Vue CLI (vuejs.org))

module.exports = {pages: {index: {// page 的入口   修改entryentry: 'src/index.js',},}}

二、Vue在脚手架中的基础

1.ref属性

简述

1. 被用来给元素或子组件注册引用信息(id的替代者)
2. 应用在html标签上获取的是真实DOM元素,应用在组件标签上是组件实例对象(vc)
3. 使用方式:1). 打标识:`<h1 ref="xxx">.....</h1>`或 `<School ref="xxx"></School>`2). 获取:`this.$refs.xxx`

编码:

<template><div id="app"><input type="text" ref="usernameRef"><button @click="showMsg">展示信息</button></div>
</template><script>export default {name: 'App',methods:{showMsg(){console.log(this.$refs.usernameRef.value);}}
}
</script>

2.prop属性

简述

1. 功能:让组件接收外部传过来的数据 (优先级比data中的更高,最好不要修改props,用props初始化data中的数据后,再改变data中的值)
2. 传递数据:`<Demo name="xxx"/>`
3. 接收数据:1. 第一种方式(只接收):`props:['name'] `2. 第二种方式(限制类型):`props:{name:String}`3. 第三种方式(限制类型、限制必要性、指定默认值):props:{name:{type:String, //类型required:true, //必要性default:'老王' //默认值}}
4.子组件向父组件传递数据时,需要父组件先给子组件传递一个函数,然后子组件调用
5.未被props接收的数据存在于this.$attrs中

编码:

// 父组件中传递porps
<Child name="小江"/>//子组件中接收使用
<template><div id="child">{{name}}</div>
</template><script>
export default {name: "Child",props:{name:{type:String,required:false,default:'张泽林'}}
};
</script>

3.混入(mixin)

简述

1. 功能:可以把多个组件共用的配置提取成一个混入对象
2. 使用方式:第一步定义混合:`{data(){....},methods:{....}....}`第二步使用混入:全局混入:`Vue.mixin(xxx)`局部混入:`mixins:['xxx']`不贵改变原有配置,而是添加配置(当配置重复时,优先级比原有配置低)

编码:

// mixin 混入文件配置
export default {methods: {showName() {console.log(this.name)}}
}// School组件中使用混入
<template><div class="school" @click="showName">{{ name }}</div>
</template><script>
import {mixin1} from '../mixin'export default {name: "Student",data() {return {name: "新东方",};},methods:{showName(){       // 配置重复,不会被覆盖alert('this.name');}},mixins:[mixin1]
};
</script>// Student中使用组件
<template><div class="student" @click="showName">{{ name }}</div>
</template><script>
import {mixin1,mixin2} from '../mixin'
export default {name: "Student",data() {return {name: "小三",};},mixins:[mixin1,mixin2]
};
</script>

4.插件

简述

1. 功能:用于增强Vue
2. 本质:包含 install 方法的一个对象,install的第一个参数是Vue,第二个以后的参数是插件使用者传递的数据。
3. 定义插件:对象.install = function (Vue, options) {// 1. 添加全局过滤器Vue.filter(....)// 2. 添加全局指令Vue.directive(....)// 3. 配置全局混入(合)Vue.mixin(....)// 4. 添加实例方法Vue.prototype.$myMethod = function () {...}Vue.prototype.$myProperty = xxxx}

编码:

// 在 plugins 文件中定义插件
export const Show = {install(Vue,...args){Vue.prototype.$show = ()=>alert(args[0]);console.log(Vue.prototype)}
}// mian.js中引入插件
import {Show} from './plugins';// 使用插件
Vue.use(Show,'小三')

5.scoped样式

1. 作用:让样式在局部生效,防止冲突。
2. 写法:`<style scoped>`
3. style语法 <style lang="css" />        使用less时,需要less-loader

编码:

<style lang="css" scoped>
.ft {color: yellow;
}
</style>

6.自定义事件

简述

1. 一种组件间通信的方式,适用于:子组件 ===> 父组件
2. 使用场景:A是父组件,B是子组件,B想给A传数据,那么就要在A中给B绑定自定义事件(事件的回调在A中)。
3. 绑定自定义事件:1. 第一种方式,在父组件中:`<Demo @clickedschoolname="test"/>`  或 `<Demo v-on:clickedschoolname="test"/>`2. 第二种方式,在父组件中:<Demo ref="demo"/>......mounted(){this.$refs.xxx.$on('clickedschoolname',this.test)}3. 若想让自定义事件只能触发一次,可以使用`once`修饰符,或`$once`方法。
4. 触发自定义事件:`this.$emit('clickedschoolname',数据)`
5. 解绑自定义事件`this.$off('clickedschoolname')` 解绑多个自定义事件 `this.$off(['clickedschoolname','demo'])`
6. 组件上也可以绑定原生DOM事件,需要使用`native`修饰符。
7. 注意:通过`this.$refs.xxx.$on('clickedschoolname',回调)`绑定自定义事件时,回调要么配置在methods中,要么用箭头函数,否则this指向会出问题!

编码

// 子组件
<template><div class="school"><h3 @click="$emit('clickedschoolname',schoolName)">{{schoolName}}</h3></div>
</template><script>
export default {name: "Student",data() {return {schoolName:'新东方'}},beforeDestroy(){this.$off('clickedschoolname');}
};
</script>// 父组件
<template><div id="app"><School @clickedschoolname="getSchoolName" ref="School" /></div>
</template><script>
import School from './components/School';export default {name: 'App',components:{School},methods:{getSchoolName(schoolName){console.log('触发了',schoolName)}},// mounted() {//   this.$refs.School.$on('clickedschoolname',(schoolName)=>{//     console.log('触发了',schoolName);//   })// },}
</script>

7.事件总线(GlobalEventBus)

简述

1. 一种组件间通信的方式,适用于 `任意组件间通信`
2. 安装全局事件总线:new Vue({......beforeCreate() {Vue.prototype.$bus = this //安装全局事件总线,$bus就是当前应用的vm}......}) 3. 使用事件总线:1. 接收数据:A组件想接收数据,则在A组件中给$bus绑定自定义事件,事件的 回调留在A组件自身。methods(){demo(data){......}}......mounted() {this.$bus.$on('xxxx',this.demo)}2. 提供数据:this.$bus.$emit('xxxx',数据)4. 最好在beforeDestroy钩子中,用$off去解绑m当前组件所用到的 事件。

编码:

// 入口文件中beforeCreate(){// 安装全局事件总线   $bus就是当前应用的vmVue.prototype.$bus = this;}// School组件    监听$bus自定义事件,获取数据,解绑自定义事件mounted(){this.$bus.$on('msg',data=>{console.log('School获取到了StudentName',data)})},beforeDestroy(){this.$bus.$off('msg');}// Student组件 触发$bus自定义事件,发送数据this.$bus.$emit("msg", this.studentName);

8.消息订阅与发布

简述:

1. 一种组件间通信的方式,适用于 任意组件间通信。
2. 使用步骤:1. 安装pubsub:npm i pubsub-js2. 引入: import pubsub from 'pubsub-js'3. 接收数据:A组件想接收数据,则在A组件中订阅消息,订阅的 回调留在A组件自身。mounted() {this.pid = pubsub.subscribe('xxx',this.demo) //订阅消息}4. 提供数据:pubsub.publish('xxx',数据)5. 最好在beforeDestroy钩子中,用PubSub.unsubscribe(pid)去 取消订阅。

编码:

// School组件  订阅消息,获取数据,取消订阅mounted(){this.pubsubId =  pubsub.subscribe('msg',(msgName,data)=>{console.log(msgName,data);})},beforeDestroy(){pubsub.unsubscribe(this.pubsubId);}// Student组件 发布消息,发送数据
pubsub.publish('msg',this.studentName);

9.$nextTick

简介:

1. 语法:this.$nextTick(回调函数)
2. 作用:在下一次 DOM 更新结束后执行其指定的回调。
3. 什么时候用:当改变数据后,要基于更新后的新DOM进行某些操作时,要在nextTick所指定的回调函数中执行。

编码:

<h3 @click="showInput">{{ schoolName }}</h3>
<input type="text" ref="inputRef" v-show="isShow">data() {return {schoolName:'新东方',isShow:false}},methods:{showInput(){this.isShow = true; // 会等函数代码执行完成之后再去重新渲染页面,但是这里input标签还未展示// ()=>this.$refs.inputRef.focus()// 方法一 使用一个定时器 利用事件轮询机制,在同步代码执行完成之后执行// setTimeout(()=>this.$refs.inputRef.focus());// 方法二 使用官方提供的方法,在下一次 DOM 更新结束后执行其指定的回调this.$nextTick(()=>{this.$refs.inputRef.focus();})}}

10.过渡与动画

作用:在插入、更新或移除 DOM元素时,在合适的时候给元素添加样式类名。

a.动画

简述

1.将需要过度的元素用`<transition name="hello" appear>`元素包裹
2.多个元素开启动画使用`transition-group>`,且每个元素都要指定`key`值。
3.写好特定名字的动画样式(tempalte name的默认值是 v).hello-enter-active{animation:show 1s;}.hello-leave-active{animation:show 1s reverse;}

编码:

<transition-group name="hello" appear><h1 v-show="isShow" class="come" key="1">你好啊</h1><h1 v-show="!isShow" class="come" key="2">尚硅谷</h1>
</transition-group>data() {return {isShow: true,};}<style scoped>
h1 {background-color: orange;color: red;
}
.hello-enter-active {animation: show 1s;
}
.hello-leave-active {animation: show 1s reverse;
}
@keyframes show {from {transform: translateX(-100%);}to {transform: translateX(0px);}
}
</style>

b.过度

各类名添加时机命名规则:

简述:

1.将需要过度的元素用`<template name="hello" appear>`元素包裹
2.多个元素开启动画使用`transition-group>`,且每个元素都要指定`key`值。
3.写好特定名字的动画样式(tempalte name的默认值是 v)/* 进入的起点,离开的终点 */.hello-enter-from,.hello-leave-to{transform: translateX(-100%);}/* 离开的终点,进入的起点 */.hello-enter-to,.hello-leave-from{transform: translateX(0);}.hello-enter-active,.hello-leave-active{transition: .5s linear;}

编码:

<transition name="hello" appear><h1 v-show="isShow" class="come">你好啊</h1>
</transition>// 其它属性<transition name="zpj" type="transform" mode="out-in" appear><component :is="isShow ? 'Home' : 'About'"></component></transition>data() {return {isShow: true,};
}<style scoped>
h1 {background-color: orange;color: red;
}
/* 进入的起点,离开的终点 */
.hello-enter,.hello-leave-to{transform: translateX(-100%);
}
/* 离开的终点,进入的起点 */
.hello-enter-to,.hello-leave{transform: translateX(0);
}.hello-enter-active,.hello-leave-active{transition: .5s linear;}
</style>

c.第三方库使用

使用css动画库animate.css
推荐 [Animate.css](Animate.css | A cross-browser library of CSS animations.)

简述:

在vue使用第三方封装的动画库// 安装
$ yarn add animate.css// 引入
import 'animate.css'

方法一:使用css帧动画

// 使用<transition name="zpj" mode="out-in" appear><component :is="isShow ? 'Home' : 'About'"></component>
</transition><style>.zpj-enter-active {animation: bounceInUp 1s ease-in;}.zpj-leave-active {animation: bounceInUp 1s ease-in reverse;}
</style>

方法二:
使用transition组件自定义attribute结合animation动画类:

使用:

    enter-active-class="animate__animated animate__bounceInDown"leave-active-class="animate__animated animate__bounceOutDown"><component :is="isShow ? 'Home' : 'About'"></component>
</transition>

使用js动画库gsap,依赖于transition组件的钩子

安装:

yarn add gsap

使用:


<transition @enter="enter" @leave="leave" :class="css"> <!-- :class使用js动画时,用于忽略检测css动画--><div v-if="isShow"><p>这是一个提示框</p></div>
</transition>import gsap from "gsap";methods: {enter(el, done) {// done用于动画结束后的回调,当没有显示调用时,会被自动同步调用,该时动画可能还未结束console.log("enter");gsap.fromTo(el,{ opacity: 0 },{ opacity: 1, duration: 1, onComplete: done });
},
leave(el, done) {console.log("leave");gsap.to(el, {opacity: 0,y: -100,duration: 0.5,ease: "power2.inOut",onComplete: done,});
},
},

使用gsap完成数字渐加动画:

<template><div class="app"><input type="number" step="10" v-model="counter" /><p>当前计数:{{ showCounter }}</p></div>
</template><script>
import gsap from "gsap";export default {name: "App",data() {return {counter: 0,showNumber: 0,};},computed: {showCounter() {return this.showNumber.toFixed(0);},},watch: {counter(val) {gsap.to(this, {duration: 1,showNumber: val,});},},
};
</script>

d.transitiongroup使用

<transition-group tag="ul" name="zpj">
// 这里的ul使用包裹遍历的li,可选择包裹元素<li v-for="item in list" :key="item.id">{{ item.text }}</li></transition-group><style>
.zpj-enter-from,
.zpj-leave-to {opacity: 0;transform: translateY(50px);
}.zpj-enter-active,
.zpj-leave-active {transition: all 0.5s ease;
}
.zpj-leave-active{position: absolute; // 让元素在被移除运行动画时,不会占有原来层级的空间,并让后面的元素往上挤
}.zpj-move {// 元素移动时使用的动画transition: transform 0.5s ease;
}
</style>

交替动画:

<transition-grouptag="ul"name="zpj"@before-enter="beforeEnter"@enter="enter"@leave="leave":class="false"
>
<!-- 传入下标,根据下标设置每个元素消失时的延迟时间,达到交替动画的效果 --><li v-for="(item, index) in showNames" :key="index" :data-index="index">{{ item }}</li>
</transition-group>

import gsap from “gsap”;

export default {
name: “App”,
data() {
return {
keyword: “”,
names: [
“abs”,
“bcd”,
“efg”,
“hij”,

],
};
},
computed: {
showNames() {
return this.names.filter((name) => ~name.indexOf(this.keyword));
},
},
methods: {
beforeEnter(el) {
el.style.opacity = 0;
el.style.height = 0;
},
enter(el, done) {
gsap.to(el, {
opacity: 1,
height: “auto”,
delay: el.dataset.index * 0.1,
onComplete: done,
});
},
leave(el, done) {
gsap.to(el, {
opacity: 0,
height: 0,
onComplete: done,
});
},
},
};

11.配置代理

a.方法一

在vue.config.js中添加如下配置:

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

说明:

  1. 优点:配置简单,请求资源时直接发给前端(8080)即可。
  2. 缺点:不能配置多个代理,不能灵活的控制请求是否走代理。
  3. 工作方式:若按照上述配置代理,当请求了前端不存在的资源时,那么该请求会转发给服务器 (优先匹配前端资源)

b.方法二

编写vue.config.js配置具体代理规则:

module.exports = {devServer: {proxy: {'/api1': {// 匹配所有以 '/api1'开头的请求路径target: 'http://localhost:5000',// 代理目标的基础路径changeOrigin: true,pathRewrite: {'^/api1': ''}},'/api2': {// 匹配所有以 '/api2'开头的请求路径target: 'http://localhost:5001',// 代理目标的基础路径changeOrigin: true,pathRewrite: {'^/api2': ''}}}}
}
/*changeOrigin设置为true时,服务器收到的请求头中的host为:localhost:5000changeOrigin设置为false时,服务器收到的请求头中的host为:localhost:8080changeOrigin默认值为true
*/

说明:

  1. 优点:可以配置多个代理,且可以灵活的控制请求是否走代理。
  2. 缺点:配置略微繁琐,请求资源时必须加前缀。

12.插槽

  1. 作用:让父组件可以向子组件指定位置插入html结构,也是一种组件间通信的方式,适用于 父组件 ===> 子组件

  2. 分类:默认插槽、具名插槽、作用域插槽

  3. 保存:给插槽传递的节点保存在this.$slots

a.默认插槽

父组件中:<Category><div>html结构1</div></Category>子组件中:<template><div><!-- 定义插槽 --><slot>插槽默认内容...</slot></div></template>

b.具名插槽

<!-- 默认的slot有一个名字为default -->
父组件中:<MyList><div slot="main">江小江</div><!--  <template v-slot:footer> --><template slot="footer"><div>我是底部</div></template></MyList>子组件中:<template><div><slot name="main"></slot><slot name="footer"></slot></div></template>

c.作用域插槽

  1. 理解:数据在组件的自身,但根据数据生成的结构需要组件的使用者来决定。

  2. 具体编码:

父组件中:<MyList><!-- <template slot-scope="{fruits}"> --><template scope="datas">{{datas.fruits}}<ul><li v-for="(f,index) of datas.fruits" :key="index">{{f}}</li></ul></template></MyList>子组件中:<slot :fruits="fruits"></slot>name: "MyList",data() {return {fruits: ["apple", "yali", "putao"],};}

Vue2脚手架创建项目相关推荐

  1. 脚手架创建项目vue2.0

    脚手架创建项目vue2.0 下载: npm i - g vue npm i - g vue-cli npm i -g webpack 检测下载版本 vue -V webpack -V 初始化项目 vu ...

  2. Vue脚手架创建项目流程

    Vue脚手架创建项目流程 图形化创建 在创建文件的文件夹打开cmd, 按住shift右键打开黑窗口,或者直接在文件夹上面路径上面输入cmd 输入vue ui 会自己在浏览器打开 点击创建项目 项目文件 ...

  3. Vue3 脚手架创建项目

    Vue 脚手架创建项目 vue 新建项目 vue create vueadmin 这个命令创建项目会只创建2个文件,这个可以是我没有选择那个安装目录这个,只点了default 模块配置导致的 重新创建 ...

  4. 【Vue】—Vue脚手架创建项目时的 linter / formatter config配置选择

    [Vue]-Vue脚手架创建项目时的 linter / formatter config配置选择 ESLint with error prevention only 只进行报错提醒 ESLint + ...

  5. 图解 利用vue-cli 脚手架创建项目

    最新图解 利用vue-cli 脚手架创建项目 首先你的node环境是搭好的 node -v 一.安装vue-cli 首先全局安装vue-cli,这里使用的是cnpm(淘宝镜像)没有就用npm,强烈建立 ...

  6. react脚手架创建项目报错,ReactDOM.render is no longer supported in React 18.

    react脚手架创建项目报错,ReactDOM.render is no longer supported in React 18. 最近新写一个react的项目,但是发现已经更新到了18.0的版本, ...

  7. 使用express脚手架创建项目

    本篇文章将介绍如何使用express脚手架express-generator快速搭建项目. 全局安装脚手架工具express-generator. cnpm i express-generator - ...

  8. vue脚手架创建项目失败,显示vue:无法加载文件

    问题描述 利用脚手架创建项目时,出现如下报错: 解决方案: 用管理员身份打开PowerShell,输入如下命令,再输入Y即可. 这样,就可以正常创建项目了.

  9. vue脚手架创建项目

    文章目录 什么是脚手架(vue-cli) 通过脚手架创建项目 脚手架的安装 3.x版本以上脚手架创建项目 命令框创建项目 使用 ui 界面创建项目 3.x 版本基于2.x的旧模板创建项目 两个版本项目 ...

最新文章

  1. .NET中使用NLog记录日志
  2. 怎么添加本地音乐_展示 | 传一学员优秀项目之音乐播放器
  3. python制作二级菜单_Python_简单三级菜单制作
  4. python3.6基础知识_python的基础知识
  5. 一次性尿袋行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  6. 操作系统—用信号量机制实现进程互斥、进程同步和前驱关系
  7. Android中如何Hook住JNI方法
  8. Linux设备管理(三):sysfs文件系统的功能及其应用
  9. JavaScript 基础概念
  10. Unity官方文档(英文)
  11. 如何使用cmd进入打印机选项_命令行方式添加打印机
  12. linux快速切换目录
  13. 关于qt缺少xcb问题终极解决办法
  14. android电话录音没有声音,Android通话录音未录制来电语音(示例代码)
  15. C语言提高代码效率的几种方法,7个提升嵌入式C代码效率的方法-嵌入式系统-与非网...
  16. 谷歌索引量查询,批量查询网站在谷歌RR权重值
  17. python泰坦尼克号生存预测论文_用Python预测泰坦尼克号生存情况
  18. python虚拟环境——pipenv
  19. 亢奋、焦虑、担忧,EOS拥趸者的无眠23小时
  20. Python爬虫要学多久

热门文章

  1. 工厂航拍全景车间VR全景线上展厅应用
  2. 基于JSP的在线书店系统
  3. [幽默网文]反派经典台词
  4. 面试官:如何让主线程等待所有的子线程执行结束之后再执行?我懵了
  5. 电子计算机课文五年级上册,新型玻璃(人教版语文五年级上册课文)_百度百科...
  6. Qml 的“Cannot assign to no-existent property “错误。
  7. Python 感叹号r !r
  8. vscode输入感叹号失效
  9. 字节跳动卖旗下金融业务 华林证券拟2000万元接盘海豚股票
  10. oracle手动分区改为自动分区,oracle12c在线转换分区表,本地索引,自动按月间隔分区...