前端开发(HTML,CSS,VUE,JS)从入门到精通!第八天(Vue框架及其安装)(完结篇) 重点 ! ! !

十三、Vue 单文件组件

1.在前面学习的传统组件存在以下问题:

(1)全局定义的组件必须保证组件名不能重复。

(2)字符串的模板缺乏高亮语法,在写多行 HTML 片段的时候,需要用到丑陋的 ”\”。

(3)不支持 CSS

(4)没有构造步骤限制,只能使用 HTML 和ES5 的 JavaScript,不能使用预处理器

2.针对传统组件存在的问题,Vue 提供了单文件组件的解决方案,单文件组件的文件扩展名为 .vue,文件内部包含了三部分内容:

(1)template:组件模板区域,用于放组件对应的 HTML 代码

(2)script:业务逻辑区域,写 JS 代码的区域

(3)style:样式区域

十四、Vue 的脚手架:Vue-CLI

1.Vue-CLI 是 Vue 官方提供的一种基于 Vue.js 进行快速开发的完整系统,可以快速搭建 Vue 的项目模板,使用 Vue 脚手架开发项目具有诸多的好处:

(1)统一的目录接口

(2)便捷的插件安装

(3)图形化的界面操作

2.Vue-CLI 的准备和安装

(1)安装node.js:

因为 Vue 脚手架的安装,启动,打包和后续项目中插件的安装都在 node.js 中进行,需要 node 的 npm 包管理器。

(2)在日常项目开发中,npm 有以下使用场景:

① 允许用户从 npm 服务器下载安装别人编写的命令行程序到本地使用

② 允许用户将自己编写的包或命令行程序上传到 npm

(3)安装 node.js:

一路向前下一步,由于后续使用 node.js 的项目需要下载一些依赖包,所以一般将 node.js 不安装在 C 盘,比如装在 D 盘

① 安装完毕,测试 node , node -v 测试 node 是否安装成功以及检查版本号;npm -v 测试 npm 是否安装成功以及检查 npm版本

② 配置 npm 下载插件的默认安装目录和缓冲目录

1)在 node 的安装目录中创建 node_global 和 node_cache 两个文件夹

a. 打开cmd,依次输入如下命令配置上面创建的文件夹

③ 配置 node 所需的环境变量

在系统环境变量中新建 NODE_PATH ,值是安装目录下 node_global 中的 node_modules 的路径:即:D:\Program Files\nodejs\node_global\node_modules

将用户环境变量的 Path 中添加 node 安装目录的 node_global 路径,即:

D:\Program Files\nodejs\node_global

注意:要将这个环境变量上移到第一个位置

(4)安装国内淘宝镜像

① 我们通过 npm 命令下载 node 插件的时候访问的是国外的网站,所以可能出现速度很慢或直接不能下载,我们可以通过配置国内镜像来解决,一般配置的是淘宝的 npm 镜像 cnpm

② 安装命令:npm install -g cnpm --registry=https://registry.npmmirror.com,注意,如果提示权限不足,那么可以使用管理员的方式来启动cmd来执行

管理员运行cmd:

③ 测试:cnpm -v

(5)安装Vue脚手架

① npm install -g @vue/cli:国外的方式,比较慢

② cnpm install -g @vue/cli:国内的方式,我们安装了淘宝镜像,所以用这个。

注意:如果安装不成功,关掉 cmd,再以管理员身份打开 cmd 安装

③ 测试命令:vue -V(这里的V大写)

④ 改变 npm 源地址(避免下载插件时卡住或失败): npm config set registry https://registry.npmmirror.com

⑤ 以后不用了卸载命令:npm uninstall -g @vue/cli

十五、使用 Vue 脚手架创建 Vue 项目

1.Vue 脚手架创建项目有两种方式:一种是命令方式,一种是图形化方式,我们这里讲解命令方式。

2.命令行创建项目的步骤:

(1)在创建 Vue 项目的文件夹上面运行 cmd,在 cmd 中创建 Vue 的项目

注意,如果此时 cmd 不是管理员的方式启动,创建 Vue 项目的过程可能失败,解决办法就是将整个 nodejs 的安装目录右键---属性---安全的 Authenticated Users 设置为完全控制就可以解决管理员的问题,设置之后普通的cmd 命令也能创建 Vue 的项目:

点击“确定”,设置成功之后就可以使用普通的 cmd 命令创建 Vue 项目:

(2) 创建 Vue 项目,在要创建 Vue 项目的目录上运行 cmd:

使用命令“vue create 项目名“ 创建 vue 基于 vue 脚手架的项目:

运行之后会进入 Vue 的配置界面:其中空格表示选中或取消,方向键用于选择,A 表示全选,回车表示下一步,运行之后,等待进入配置界面:

(3) 我们选择 Deault Vue2,回车

(4) 等待下载依赖完成

(5) 项目创建完成后

然后我们按照提示去编译项目:

(6) 然后我们通过上面的 URL 地址去访问一下,就可以看到 Vue 项目运行后的界面了

我们要结束项目的运行可以在已经运行 vue 项目的 cmd 中按 Ctrl + C 即可终止项目运行:

3. vue 脚手架项目的解读

(1) 我们可以把 vue 项目用 IDEA 集成开发环境打开

注意:如果有些同学在创建 vue 的项目时发生错误,那么就使用管理员方式打开 cmd 来创建,并且 IDEA 也要用管理员方式打开来查看 vue 的项目

(2) 打开的 vue 的项目的结构如下图:

vue 的示例工程源码分析:

main.js:

App.vue 根组件:

HelloWorld.vue 子组件:

<template>
<div class="hello">
<!--    子组件 HelloWorld 通过表达式显示自己的 Vue 实例的属性 msg,而这个 msg 是父组件传递过来的属性-->
<h1>{{ msg }}</h1>
<p>
For a guide and recipes on how to configure / customize this project,<br>
check out the
<a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>.
</p>
<h3>Installed CLI Plugins</h3>
<ul>
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li>
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint" target="_blank" rel="noopener">eslint</a></li>
</ul>
<h3>Essential Links</h3>
<ul>
<li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li>
<li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li>
<li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li>
<li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li>
<li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li>
</ul>
<h3>Ecosystem</h3>
<ul>
<li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li>
<li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li>
<li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li>
<li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li>
<li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li>
</ul>
</div>
</template>

<script>
export default {//导出子组件
name: 'HelloWorld',//子组件名称
props: { //这种写法和 props:["msg"] 是一样的,都是表示这个 msg 用来接收父组件传递过来的属性值,只是这种写法可以指明msg 属性的类型
msg: String //此时的 msg 属性将作为子组件 HelloWorld 对应 Vue 对象的一个属性
}
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h3 {
margin: 40px 0 0;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: inline-block;
margin: 0 10px;
}
a {
color: #42b983;
}
</style>

现在我们自己创建一个子组件来使用一下,注意,Vue 脚手架规定在创建组件的时候,组件的名字必须是两个单词,并且两个单词的首字母都要大写:

UserComponent.vue 代码:

然后在 根组件 App.vue 中引入我们自己的组件,我们可以删除自带的 HelloWorld 组件:

然后我们在 IDEA 的终端(Terminal)中运行:npm run serve

然后它会去编译,编译完成后会生成访问该 Vue 项目的 URL 地址:

点击上面的超链接就可以运行:

十六、组件之间共享数据的方式

1.组件之间共享数据的方式主要分为三种:

(1)父向子传值:使用 v-bind 属性绑定,在子组件上绑定参数,传递数据(props):

删除自带的 HelloWorld 组件,创建一个子组件 NewsItems:

在根组件 App.vue 中使用子组件 NewsItems,IDEA 会自动帮我们导入:

在父组件 App.vue 中传递属性值到子组件 NewsItems 中:

<template>
<div id="app">
<h1>我是父组件</h1>
<NewsItems :news_title="news.title" :news_content="news.content"></NewsItems>
</div>
</template>

<script>

import NewsItems from "@/components/NewsItems";
export default {
name: 'App', //根组件的名称
components: {
NewsItems //注册 UserComponent 组件,是一个局部组件
},
data() { //ES6的新语法,等效于在 data 后面跟一个匿名函数
return {
//父组件对应的 Vue 对象的属性
news: {
title: "新闻标题",
content: "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Adipisci consequatur impedit saepe temporibus voluptas. Aspernatur consectetur dolore est inventore nam numquam, ullam voluptate? Adipisci est itaque, laudantium nisi repudiandae voluptatibus."
}
}
}
}
</script>

<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>

子组件 NewsItems 中通过 props 选项接收:

<template>
<div>
<h1>我是子组件</h1>
<h3>{{news_title}}</h3>
<p>{{news_content}}</p>
</div>
</template>

<script>
export default {
name: "NewsItems",
/**
* props 选项用于接收父组件传递过来的属性,属性名写在 "[]" 内,可以接收多个属性,此时这些属性 news_title,news_content 将
* 作为该子组件对应的 Vue 实例的属性,就可以使用表达式 {{}} 输出
*/
props: ["news_title","news_content"]
}
</script>

<style scoped>

</style>

运行起来看看:

(2)子向父传值:使用 v-on 事件绑定,在子组件上绑定自定义事件,传递数据,父组件中监听这个自定义事件,获取子组件传递过来的数据

创建子组件 SubComponent.vue:

父组件就是使用该子组件 SubComponent 的根组件 App.vue:

<template>
<div id="app">
<h1>我是父组件</h1>
<!--在父组件中监听子组件发送的 son 事件,当 son 事件发生的时候,事件函数 getparam 就自动执行了,就可以获取子组件的 son 事件
发送过来的参数(消息)-->
<SubComponent @son="getparam"></SubComponent>
<p>父组件接收到子组件传递过来的消息为:{{msg}}</p>
</div>
</template>

<script>

import SubComponent from "@/components/SubComponent";
export default {
name: 'App', //根组件的名称
components: {
SubComponent

  },
data() { //ES6的新语法,等效于在 data 后面跟一个匿名函数
return {
//父组件对应的 Vue 对象的属性
msg: '' //父组件 App 的属性
}
},
methods: {
getparam: function (param) {//son 事件的事件函数,param 参数就是子组件的 son 事件发送过来的参数(消息)
this.msg = param;//把子组件的 son 事件发送的参数 param 赋值给父组件 App 的属性 msg
}
}
}
</script>

<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>

运行起来:npm run serve

(3)兄弟组件传值:创建共享的消息总线

1)接收数据的组件:$on 监听总线事件

2)发送数据的组件:$emit 发送总线事件

示例:

创建一个兄弟组件:

创建另一个兄弟组件:

<template>
<div>
<h3>{{msg}}</h3>
</div>
</template>

<script>
import Vue from 'vue';
/**
* 创建一个全局的 Vue 对象 Bus,作为消息总线,每个组件中都可以通过 this 来访问这个 Bus,然后使用这个全局的 Bus 对象来
* 监听事件($on)和发送事件($emit)
*/
Vue.prototype.Bus = new Vue();//一个全局的 Vue 对象作为消息总线 Bus

export default {
name: "OtherComponent",
data(){ //ES6
return {
msg:'' //当前组件的属性
}
},
mounted() {//ES6,生命周期方法,当 Vue 实例挂载到 DOM 上之后自动执行
//在生命周期方法 mounted() 中,this 指的是 OtherComponent 对应的 Vue 对象
var $this = this;
//$on() 方法是Vue实例的实例方法,第一个参数为监听的事件名,第二个参数为事件函数,事件函数的参数 param 就是接收到的事件参数值
this.Bus.$on("brother", function (param) {
/**
* 这里不能使用 this.msg = param,因为我们使用的是 Bus 对象来监听事件,并不是当前组件 OtherComponent 对应的 Vue 对象,
* 所以这里的 this.msg 不是指 OtherComponent 组件的 msg
*/
$this.msg = param;//这里的 $this 就是指 OtherComponent 对应的 Vue 对象
});
}
}
</script>

<style scoped>

</style>

然后在根组件 App.vue 中使用这两个兄弟组件:

测试:npm run serve

十七、Vue Router(Vue路由)

1.什么是路由

(1)Vue Router

是 Vue.js(Vue脚手架工程)官方的路由管理器,它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。SPA 单页面应用是指,整个网站只有一个页面,当 Vue 感知 URL 变化的时候,会动态的把当前页面的内容清除掉,再把下一个页面的内容挂载到当前页面。Vue 实现的单页面应用,页面组件片段切换快,用户体验好。

(2)基本使用步骤:

1)创建vue的项目:vue create 项目名

2)选择Manually select features,回车

3)按上下键移动,按空格可以选中或取消,按空格选中 Router,回车,其他保持默认值:

4)选择 Vue 的版本,我们选择 2.x 版本,回车

5)是否使用历史的路由模式,输入n回车:

6)直接回车

7)直接回车

8)直接回车

9)是否保存配置,输入 N,回车

10)等待创建

创建完成之后,使用 IDEA 打开,打开之后发现多了一些文件,这些文件就是 Vue 路由相关的文件:

(3)简单使用 Vue Router

1)找两幅图片放在 assets 文件夹中

2)删除 views 目录中原来的所有组件,然后在 views 目录中创建两个组件:ChengshiComponent 和 XingkongComponent:

3)在 router-->index.js 文件中配置路由,将原来的路由配置删除:

4)配置完路由之后,我们需要修改根组件 App.vue 来调用路由:

<template>
<div id="app">
<nav>
<!--
<router-link> 其实就是一个增强型的 a 标签,它的 to 属性相当于是 a 标签的 href 属性,to 属性值就是在 router--index.js
中配置的路径地址
-->
<router-link to="/chengshi">城市</router-link> |
<router-link to="/xingkong">星空</router-link>
</nav>
<!--
<router-view>:引用路由显示的地方,即你点击上面哪一个链接地址,<router-view> 就显示哪一个路由地址对应的组件内容
-->
<router-view/>
</div>
</template>

<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
}

nav {
padding: 30px;
}

nav a {
font-weight: bold;
color: #2c3e50;
}

nav a.router-link-exact-active {
color: #42b983;
}
</style>

测试:npm run serve

2.路由重定向

(1)页面打开时,其实也是有一个链接地址 “/”,现在我们希望默认地址可以指向其他链接,要实现这个功能,我们需要用到路由重定向,路由重定向是指,用户在访问地址 A 的时候,强制用户跳转到地址 B,从而展示特定的组件页面。

(2)Vue 实现路由重定向是通过路由规则中的 redirect 属性,为 path 指定一个新的路由地址,这样就完成了路由重定向的设置,例如:

示例:实现打开网页默认显示城市图片,访问城市路由

router---index.js:

保存,会进行自动编译,直接运行即可:

3.嵌套路由

(1)引入

在前面的章节中,我们学习了组件的开发和应用,在实际应用开发界面中,通过由多层嵌套的组件组合而成,比如我们登录组件中,需要嵌套立即注册和忘记密码操作,这就需要使用到 Vue 的路由中的嵌套路由操作,嵌套路由是指通过路由规则层级嵌套,可以在页面上展示出复杂的组件结构关系。

(2)嵌套路由需求分析

点击父级路由链接显示模板内容,模板内容又有子级路由链接,点击子级路由链接显示子级模板内容。

(3)实现思路:

① 在父路由组件中添加子路由链接和路由占位符

② 在父路由规则中,通过 children 属性,添加子路由规则,例如:

1)第一步:

2)第二步:在父路由组件中添加子路由链接和路由占位符

示例:优化代码,当点击城市的时候,在图片的下方会出现两个超链接,点击任意一个,下面会出现对应的城市

开发步骤:

1)创建 HeNanComponent 组件,代表河南城市分类

2)创建 HeBeiComponent 组件,代表河北城市分类:

3)在 router--->index.js 中对这两个子路由进行配置:

import Vue from 'vue'
import VueRouter from 'vue-router'
import ChengshiComponent from "@/views/ChengshiComponent";
import XingkongComponent from "@/views/XingkongComponent";
import HeNanComponent from "@/views/HeNanComponent";
import HeBeiComponent from "@/views/HeBeiComponent";

Vue.use(VueRouter)

const routes = [{
/**
* 应用默认情况下访问的是 "/" 地址,通过 redirect: "/chengshi",在应用启动的时候重定向到 /chengshi 对应的组件
* 来显示
*/
path: "/",
redirect: "/chengshi"
},{ //第一个路由配置
//路由配置,path:路由的 URL 地址,component:路由对应的组件,还有一个 name 选项后面讲
path: '/chengshi',
component: ChengshiComponent,
//子路由配置
children:[{
path:'henan',//子路由的地址前面没有"/"
component: HeNanComponent
},{
path:'hebei',//子路由的地址前面没有"/"
component: HeBeiComponent
}
]
},{//第二个路由配置
path: '/xingkong',
component: XingkongComponent
}
]

const router = new VueRouter({
routes
})

export default router

4)子路由配置好之后,我们就可以在父组件 ChengshiComponent 中添加<router-link>来访问子路由(嵌套路由):

<template>
<div>
<img src="../assets/1.jpg" alt="" width="600" height="400">
<br>
<!--子路由的地址一定要跟上副路由的路径,要完整-->
<router-link to="/chengshi/henan">河南</router-link> |
<router-link to="/chengshi/hebei">河北</router-link>
<!--通过 <router-view> 显示对应的子组件-->
<router-view></router-view>
</div>
</template>

<script>
export default {
name: "ChengshiComponent"
}
</script>

<style scoped>

</style>

5) 测试:运行 npm run serve

4.命名路由和编程式路由导航

(1)name 命名路由:

有时候,通过一个名称来标识一个路由会显得更方便一些,特别是在执行路由跳转,路由链接或路由传参的时候,我们可以在创建 Router 实例的时候,在 routes 配置中给某个路由设置名称。

(2)语法:

(3)调用路由:

调用路由分为编程式导航调用路由和声明式调用路由,编程式后面会讲,声明式导航就是用到前面的<router-link to="/路径"></router-link> 这种直接当成 a 标签引用的被称为声明式导航。

(4)声明式导航调用路由的方法有三种:

① 第一种:<router-link to="/path地址">提示文字</router-link>

② 第二种:使用 path 关键字,<router-link :to="{path:’path地址’}">提示文字</router-link>,这里的path地址不需要 ”/”

③ 第三种:使用 name 关键字,<router-link :to="{name:’路由的name名称’}">提示文字</router-link>

示例:优化代码,给两个子路由添加 name 名称,使调用路由的时候,路径不用写那么长

第一步:修改 router--->index.js 配置文件,添加 name 属性;

第二步:修改父组件 ChengshiComponent,修改 to 中的值:

测试:

(5)编程式路由导航

1)Vue 路由中页面导航有两种方式:

a. 声明式路由导航:通过点击 <router-link> 超链接实现路由的导航的方式叫做声明式导航,例如上面的例子就是。

b. 编程式导航:通过调用 API 实现导航的方式,叫做编程式导航。

2)Vue 实现编程式导航,常见的 Vue 路由编程式导航的 API 如下:

a. this.$router.push(“地址”);

b. this.$router.go(n);

我们选择第一种方式,语法如下:

第一种:this.$router.push(“路由配置的path地址”);//注意没有”/”

第二种:this.$router.push({path:”路由配置的path地址”});//也没有”/”

第三种:this.$router.push({name:”路由的name名称”});

示例:使用编程式导航改造上面的代码

第一个:修改父组件 ChengshiComponent ,添加按钮并添加单击事件:

<template>
<div>
<img src="../assets/1.jpg" alt="" width="600" height="400">
<br>
<!--子路由的地址一定要跟上副路由的路径,要完整-->
<router-link to="/chengshi/henan">河南</router-link>
<router-link :to="{path:'/chengshi/henan'}">河南</router-link>
<router-link :to="{name:'hn'}">河南</router-link>
<button @click="henan">河南</button>
|
<router-link to="/chengshi/hebei">河北</router-link>
<router-link :to="{name:'hb'}">河北</router-link>
<!--通过 <router-view> 显示对应的子组件-->
<router-view></router-view>
</div>
</template>

<script>
export default {
name: "ChengshiComponent",
methods: {
henan() {//事件函数,ES6语法
/**
* 在进行编程式导航时, push() 方法的第二个参数要给出一个箭头函数,表示定义的回调函数,避免重复点击按钮时出现错误,
* 如果不写,就肯能会出错
*/
//注意这里的 path 地址没有"/"
//this.$router.push('henan',()=>{});
//地址 henan 不要 "/"
//this.$router.push({path:'henan'}, ()=>{});
this.$router.push({name:'hn'}, ()=>{});
}
}
}
</script>

<style scoped>

</style>

测试:

(6)路由导航传参

在 Vue 路由中,针对不同的路由导航有不同的传参方式,这里主要是根据 path 属性或 name 属性进行区分,无论是上面的声明式还是编程式操作基本一致。

1)声明式导航传参

第一种:path+query属性

<router-link :to="{path:’path地址’,query:{参数1:值1,参数2:值2,...}}">提示文字</router-link>

组件中获取参数:{{this.$route.query.参数名}}

第二种:name+params属性

<router-link :to="{name:’name名称’,params:{参数1:值1,参数2:值2,...}}">提示文字</router-link>

组件中获取参数:{{this.$route.params.参数名}}

示例:在河北和河南中添加 li,内容为调用时传递的路由参数

第一步:修改 HeNanComponent:

第二步:修改 HeBeiComponent:

第三步:修改父组件 ChengshiComponent,传递参数:

<template>
<div>
<img src="../assets/1.jpg" alt="" width="600" height="400">
<br>
<!--子路由的地址一定要跟上副路由的路径,要完整-->
<router-link to="/chengshi/henan">河南</router-link>
<router-link :to="{path:'/chengshi/henan', query:{henan:'query 参数值'}}">河南 args</router-link>
<router-link :to="{name:'hn'}">河南</router-link>
<button @click="henan">河南</button>
|
<router-link to="/chengshi/hebei">河北</router-link>
<router-link :to="{name:'hb', params:{hebei:'params 参数值'}}">河北 args</router-link>
<!--通过 <router-view> 显示对应的子组件-->
<router-view></router-view>
</div>
</template>

<script>
export default {
name: "ChengshiComponent",
methods: {
henan() {//事件函数,ES6语法
/**
* 在进行编程式导航时, push() 方法的第二个参数要给出一个箭头函数,表示定义的回调函数,避免重复点击按钮时出现错误,
* 如果不写,就肯能会出错
*/
//注意这里的 path 地址没有"/"
//this.$router.push('henan',()=>{});
//地址 henan 不要 "/"
//this.$router.push({path:'henan'}, ()=>{});
this.$router.push({name:'hn'}, ()=>{});
}
}
}
</script>

<style scoped>

</style>

测试:

2)编程式导航传参:编程式导航传参和声明式导航传参差不多,只不过不是用标签,而是在方法内传参:

示例:

测试:

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

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

相关文章

2025最新国内服务器可用docker源仓库地址大全(2025年8月更新) · DockerHub镜像加速全面指南

2025最新国内服务器可用docker源仓库地址大全&#xff08;2025年8月更新&#xff09; DockerHub镜像加速全面指南 2025年8月&#xff0c;随着云原生技术的深入普及&#xff0c;开发者在使用 Docker 拉取 镜像 时&#xff0c;经常遭遇 超时、镜像下载失败、无法拉取 等网络瓶颈…

GitLab同步提交的用户设置

内容&#xff1a;在GitLab同步提交的用户设置中&#xff0c;部分用户的代码提交仍未与GitLab同步&#xff0c;导致无法在GitLab上显示提交者的用户名。1、检查下gitlab账户的设置 登录gitlab后&#xff0c;右上角个人头像点开后&#xff0c;可以看到姓名和账户2、不对的话&…

Web 图像捕获革命:ImageCapture API 全面解析与实战指南

概述 ImageCapture API 是 Web API 的一部分&#xff0c;允许网页应用直接访问和控制设备摄像头&#xff0c;实现高质量的图像捕获功能。该 API 提供了比传统的 getUserMedia() 更精细的控制能力&#xff0c;支持设置分辨率、白平衡、曝光等参数。 核心特性 1. 高质量图像捕…

ASP.NET三层架构成绩管理系统源码

一、系统简介 本次设计的成绩管理系统是基于ASP.NET WebForm技术开发的Web应用程序&#xff0c;采用经典的三层架构&#xff08;表示层、业务逻辑层、数据访问层&#xff09;设计模式&#xff0c;结合前端HTML、JavaScript、jQuery及ECharts图表库&#xff0c;后端使用C#语言、…

Linux 内存管理之page folios

文章目录前言一、简介struct folio二、page folios的好处2.1 compound page2.2 page cache三、buffer_head、iomap与page folios四、何时分配 Large Folio五、folio结构体演变六、内核主线folio的逐步使用参考资料前言 Linux 内核的内存管理子系统以“页”&#xff08;page&am…

[优选算法专题一双指针——两数之和](双指针和哈希表)

题目链接 LeetCode两数之和 题目描述 题目解析 注意&#xff1a;前提条件&#xff1a;输入的数组numbers是已排序的。 核心思路&#xff1a;双指针法 利用数组已排序的特性&#xff0c;通过两个指针从两端向中间移动&#xff0c;快速定位符合条件的两个数&#xff0c;时间…

佳维视高亮度工业显示器,强光环境清晰可见

在工业、户外或高光照场景中&#xff0c;普通显示器常因环境光干扰导致画面模糊、色彩失真&#xff0c;甚至无法操作。高亮度工业显示器通过技术优化与专业设计&#xff0c;突破光线限制&#xff0c;确保在强光下仍能呈现清晰、稳定的视觉效果&#xff0c;成为关键任务环境中的…

系统的缓存(buff/cache)是如何影响系统性能的?

系统的缓存&#xff08;buff/cache&#xff0c;包括 buffer 和 cache&#xff09;是 Linux 内核为提升系统性能设计的关键机制&#xff0c;其对性能的影响主要体现在加速数据访问和平衡内存与磁盘速度差异上&#xff0c;具体如下&#xff1a; 一、buff/cache 的本质&#xff1a…

浅析 Berachain v2 ,对原有 PoL 机制进行了哪些升级?

Berachain 本身是一个特色鲜明的 Layer1 区块链项目&#xff0c;其最具辨识度的创新在于采用了 PoL&#xff08;Proof of Liquidity&#xff09;区块奖励分配机制。该机制把链的区块奖励转化为生态增长动力的协议内经济机制&#xff0c;通过将绝大部分奖励直接分配给生态中的用…

校招秋招春招小米在线测评小米测评题库|测评解析和攻略|题库分享

秒收测评 小米校招投递简历之后会立马收到在线测评&#xff0c;在线测评考察的内容就是行测和性格测试。 具体内容 小米在线测评有五部分组成&#xff0c;其中第一、二、三部分各限时 10 分钟&#xff0c;并且每题只有 70 秒左右&#xff0c;时间到自动跳到下一题&#xff0…

遮天(帝国篇)

距离轩辕鸿天成为道盟盟主已经过去了三十年&#xff0c;卡萨帝国国君卡萨也在一次战争中被妖族所杀&#xff0c;留下了两个年幼的儿子&#xff0c;长子卡利尔&#xff0c;次子卡修。 卡萨死后一直是大将军戈隆掌控帝国事务&#xff0c;戈隆秉承着道盟见妖就杀的理念让卡萨帝国成…

批量将NC格式数据转换为TIF格式:解决转换后图像颠倒、镜像、翻转等问题

本文介绍基于Python中GDAL模块&#xff0c;批量将大量.nc格式的栅格文件转换为.tif格式&#xff0c;并解决可能出现的转换后图像颠倒、镜像、翻转等问题。最近&#xff0c;需要批量将大量.nc格式的栅格文件转换为.tif格式。如下图所示&#xff0c;有多个待转换的.nc格式文件&am…

《论三生原理》重构数学哲学基础语义场‌?

AI辅助创作&#xff1a;《论三生原理》通过算法化转译传统文化符号、重构数学对象本体论及创新术语体系&#xff0c;系统性重构数学哲学基础语义场&#xff0c;其核心路径如下&#xff1a;&#x1f50d; 一、哲学符号的数学实体化‌阴阳范畴的数理转译‌将《周易》“阴/阳”抽象…

适用于在线3D测量和检测的3D激光轮廓仪

Z-Trak™ Express 1K5 系列是Z-Trak系列中的最新创新成果&#xff0c;专为实现经济高效的在线3D测量和检测而设计&#xff0c;在整个测量范围内可实现每秒最多 5,000 个轮廓的测量速率&#xff0c;具有高速检测能力和实时处理性能。Z-Trak™ Express 1K5系列 3D激光轮廓仪Z-Tra…

主播生活模拟器2|主播人生模拟器2 (Streamer Life Simulator 2)免安装中文版

网盘链接&#xff1a; 七主播生活模拟器2|主播人生模拟器2 名称&#xff1a;七主播生活模拟器2|主播人生模拟器2 &#xff08;Streamer Life Simulator 2&#xff09;免安装中文版 描述&#xff1a;《主播人生模拟器》是一款从零开始&#xff0c;努力成为一名受欢迎的网络主…

解决React白板应用中的画布内容丢失问题

解决React白板应用中的画布内容丢失问题 在开发基于React的在线白板应用时&#xff0c;我们遇到了一个棘手问题&#xff1a;当用户滚动到底部自动扩展画布时&#xff0c;原有绘制内容会神秘消失。经过系统排查&#xff0c;最终通过Canvas API的巧妙运用解决了这个问题。以下是完…

韩国宝蓝集团与Alpha World、非小号Alpha正式达成战略合作

2025年8月1日&#xff0c;Boram Group(宝蓝集团)旗下Boram Sangjo特销团队正式宣布&#xff0c;已与全球Web3平台 Alpha World 以及加密数据平台 非小号Alpha&#xff08;FXH Alpha&#xff09;达成三方战略合作。始于1991–1992年创立的 Boram Sangjo Development隶属于Boram …

手动开发一个TCP服务器调试工具(二):无界面 TCP 通信服最小实现

本篇将讲解如何使用 Qt 构建一个简单但完整的TCP 服务端&#xff0c;无需图形界面。✦ 程序功能概览 启动一个监听本地 12345 端口的 TCP 服务&#xff1b;有客户端连接时输出信息&#xff1b;每秒向客户端发送一次当前时间&#xff1b;支持接收客户端数据&#xff1b;客户端断…

​​大语言模型(LLM)实战应用:从微调到部署全流程​​

摘要​​ 大语言模型&#xff08;LLM&#xff09;已成为AI落地的核心驱动力&#xff0c;但其从预训练状态到生产环境的转化仍面临技术复杂度高、资源消耗大等挑战。本文系统梳理LLM实战全流程&#xff0c;涵盖​​微调策略选择​​、​​量化压缩技术​​、​​部署优化方案​​…

基于Web的交互式坐标系变换矩阵计算工具

基于Web的交互式坐标系变换矩阵计算工具一、什么是坐标系变换矩阵&#xff1f;二、为什么需要这个工具&#xff1f;三、效果四、功能介绍1、坐标系定义2、交互控制3、变换矩阵计算五、如何使用这个工具六、完整代码七、总结一、什么是坐标系变换矩阵&#xff1f; 在三维空间中…