# vuedemo202204 **Repository Path**: driftfloat/vuedemo202204 ## Basic Information - **Project Name**: vuedemo202204 - **Description**: vuedemo - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2022-10-30 - **Last Updated**: 2022-10-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Vue ## 本地构建 1. 运行命令 ~~~shell npm init vue@latest ~~~ 按照步骤一路默认创建 2. 安装依赖 ~~~shell npm i ~~~ 3. 运行 ~~~shell npm run dev ~~~ ## 非本地构建 ~~~html
{{msg}}
~~~ ## Vue渲染模板 * 挂载容器内的innerHTML (没有template和render选项) * template 如果有这个选项,它会替换 容器内的innerHTML * render 渲染函数 它的优先级最高 ## Vue实例属性 * 以$开头 在定义响应式对象属性时,属性名避免使用$开头 * 访问根组件的属性或方法时 > 方式 一通过实例对象 > > app.$data.msg > > app.msg > > 方式二 > > 在组件对象内,可以通过this来访问 > > this.$data.msg > > this.msg ## 内置属性 以 _ 开头 是内置属性 , 在定义响应式对象属性时,属性名避免使用_开头 ## 属性绑定 * v-bind:属性名="响应对象属性||计算属性" * 简化 :属性名="响应对象属性||计算属性" (开发常用 ) > 如果v-bind绑定的是一个对象,则不能使用简化形式 ## 布尔属性 * disabled 可用/不可用 * hidden 隐藏/不隐藏 如果绑定的值是true 或 "" ,具有该属性 ,否则没有该属性 ## 计算属性 在{{}} 使用表达式,建议使用简单表达式 对于复杂的逻辑表达式,建议使用计算属性 选项: ## computed * 默认的是只读的 * 属性名是字符串 ,类型可以是函数和对象 > 1. 函数 > > 属性名:function(){} 直接返回一个新的值 > > 2. 对象 > > 属性名:{ > > //只读的 返回值 > > ​ get:function(){}, > > //可写的,但更改的仍然是响应式对象的属性 v是新值 > > set:function(v){} > > } ## 绑定事件 * v-on:事件名称 ="方法||表达式" * @事件名称="方法||表达式" 事件方法传值: * 只传递方法名 适合方法没有参数的情况 > 如果方法定义时有参数,则该参数是 一个事件对象 * 调用方法 方法名() 适合有参数的情况 > 如果方法定义时有参数,调用时无参,参数值是undefined 事件冒泡 事件捕获 ## 样式绑定 ### class绑定 1. 三元表达式 ~~~html - - ~~~ 2. 绑定对象 :class="{样式名称:布尔表达式}" 只有布尔表达式为true才会有该样式 ~~~html - ~~~ 3. 绑定数组 :class=[] ### 内联style绑定 ~~~html 内联样式 内联样式 内联直接传递对象 ~~~ 绑定数组,可以传递多个对象 ## 条件渲染 v-if与v-show区别 * v-if是创建和销毁,有很高的切换开销,如果初始条件不成立,代码不会创建 * v-show不管条件是否成立,都会创建,有很高的初始渲染开销 * 如果需要频繁切换,则使用 `v-show` 较好;如果在运行时绑定条件很少改变,则 `v-if` 会更合适 ## 列表渲染 ### 遍历数组 * 一个参数 item in items item 是变量名,items是数组 * 二个参数 (item,index) in items item 是变量名,index是索引,items是数组 ### 遍历范围 ​ item in number item 是变量名,number是一个整数,用来循环number次 ### 遍历对象 * 一个参数 v in obj v是对象属性的值,obj要遍历的对象 * 二个参数 (v,n) in obj v是对象属性的值,n是对象的属性名,obj要遍历的对象 * 三个参数 (v,n,index)in obj v是对象属性的值,n是对象的属性名,index是索引,obj要遍历的对象 注意:v-for与v-if不要一起使用 ## 表单绑定 使用v-model指令实现双向绑定 表单: 文本框 textarea select checkbox radio 注意: * 复选框 > 1. 一个复选框,v-model绑定一个布尔值,为真选中,否则不选中 > 2. 多个复选框,v-model绑定一个数组,(数组里有值则为默认值,对应的复选框选 中) * select > 1. 单选 v-model绑定一个变量 > 2. 多选 v-model绑定一个数组 ## 生命周期函数 ![image-20220822175211058](assets/image-20220822175211058.png) ## 侦听器 ![image-20220823095415101](assets/image-20220823095415101.png) ## 组件 ### vue代码片段 vscode vue代码片段定义: ~~~javascript { "vue template":{ "scope": "vue", "prefix": "vue", "body":[ "", "", "", "", "", "", "", "" ] } } ~~~ ### 组件注册 #### 全局注册 ~~~vue app.component("组件名",组件) ~~~ 全局注册的组件,在整个应用中都可以使用 #### 局部注册 通过选项:components:{} 注册 ~~~javascript import CarItem from '@/components/CarItem.vue' export default { //组件的局部注册 components: { CarItem //简写 === "CarItem":CarItem 驼峰命名法 组件引用时可以使用驼峰名称也可以使用对应的短横线命名 //"car-item":CarItem //只能使用短横线命名 } } ~~~ #### 组件名称 * 驼峰命名法 所有单词首字母大写 组件引用时可以使用驼峰名称也可以使用对应的短横线命名,如 ~~~html ~~~ * 短横线命名法 如 "car-item":组件 ,引用时只能使用 ### Props属性 (父组件给子组件传值) 定义属性有两种方式: * 字符串数组 ~~~javascript props:["属性名"...] ~~~ 通过数组指明多个属性,这种方式过于简单 ,在开发中推荐使用对象形式 * 对象形式 ~~~javascript props:{ 属性名:{ type?: PropType required?: boolean default?: T | ((rawProps: object) => T) validator?: (value: unknown) => boolean } } ~~~ > 1. type 数据类型 > > 可以是下列原生构造函数之一:`String`、`Number`、`Boolean`、`Array`、`Object`、`Date`、`Function`、`Symbol`、任何自定义构造函数,或由上述内容组成的数组。 > > 2. **`required`**:定义该 prop 是否必需传入 > > 3. default默认值 > > * 为该 prop 指定一个当其没有被传入或值为 `undefined` 时的默认值。 > * 对象或数组的默认值必须从一个工厂函数返回。工厂函数也接收原始 prop 对象作为参数。 > > 4. validator 验证器,接收一个函数,该函数有一个参数指向属性值,返回false验证失败 ### 事件(子组件给父组件传值) * 父组件监听子组件事件 通过v-on或@ 自定义事件名 * 子组件触发事件并传值 ~~~javascript $emit(event: string, ...args: any[]): void ~~~ 如 ~~~javascript //在子组件中触发一个自定义的事件 this.$emit("close","张三",23,"13555555"); ~~~ 父组件接收: ~~~javascript ..... closeUser(name,age,mobile){ console.log("父组件收到值:",name,age,mobile); //隐藏保存用户组件 this.ishow=false; } ~~~ ### 透传属性 如果在子组件中定义了一个单根元素,那么给子组件传递的未通过props定义的属性时,默认会将属性添加到根元素上,这就是透传。 透传属性常用的有class style id 如果想禁用属性继承,既不想让未定义的属性添加到单根元素上,可以禁用inheritAttrs:false ,禁用后的属性只能通过实例属性$attrs来访问 ### 插槽 插槽是在子组件中获得 由子组件包裹的内容 ,如下 ~~~html 你好,张三 ~~~ 将 “你好,张三” 显示在hello组件内: ~~~html ~~~ 注: * 插槽内容可以访问到父组件的数据作用域,因为插槽内容本身是在父组件模板中定义的 * 插槽 默认值 可以提供默认值,如果没有插槽内容显示默认的 * 插槽 可以指定名字,默认为default * 给指定名称的插槽传递插槽内容时,可以通过 * v-slot可以简化为#,既 * 插槽内容中默认无法访问子组件中的数据作用域 * 可以给插槽定义属性,接收数据,然后在插槽内访问,如 ~~~html ~~~ 访问: ~~~html ~~~ 或者使用解构赋值: ~~~html ~~~ * 具名插槽属性访问时 ~~~html ~~~ 或者 ~~~html ~~~ 注:同样上面的object,可以换成{slot属性名}。 ### 依赖注入 ​ 在父组件中,通过provide选项,配置要传递给后代子孙的属性,如 ~~~json provide:{ "host":"http://localhost:8080" } ~~~ 在后代子组件中,需要该属性的,可以通过inject注入,如 ~~~json inject:["host"] //通过数组的形式注入 ~~~ 或者 ~~~json inject:{ 属性名:{ //属性名自定义 代表host在当前组件的别名 from:"host", //来自哪个provide属性 default:"" //如果注入的属性不存在或undefined 时,默认值 } } ~~~ 注: inject注入时在data响应状太解析之前,所以可以在响应状态对象中直接访问注入属性 ### 插件 插件是在vue上增加全局功能 (属性、方法等),可以通过 app.use(plugin,参数); 来安装插件,plugin可以是install函数或者包含install函数的对象,在该函数中接收多个参数,第一个代表vue实例,如增加全局属性$host,实现如下: ~~~javascript let myplugin={ //instance vue实例 install:function(instance){ instance.config.globalProperties.$host="http://localhost:8080"; instance.config.globalProperties.$test=function(){ console.log("-------插件方法"); } } }; //安装插件 app.use(myplugin); ~~~ ## Vue Router 路由 ### 安装 ~~~shell npm install vue-router@4 ~~~ ### 配置路由 ~~~javascript //配置路由模板 //引入路由 import {createRouter,createWebHashHistory} from 'vue-router' //引入组件 import Login from '@/views/common/Login.vue' //配置路由信息 const routes=[ { path:"/", component:Login } ]; //创建路由实例 let router=createRouter({ history: createWebHashHistory(), routes //等同于 "routes":routes }); export default router; ~~~ ### 安装插件 ~~~javascript import { createApp } from 'vue' //引入路由 import router from './router'; import App from './App.vue' //创建vue组件 const app=createApp(App); //将路由实例安装到vue上 app.use(router); //挂载 app.mount("#app"); ~~~ ### 配置路由出口 在根组件上,增加如下 ~~~html ~~~ ### 嵌套路由 在一个组件中,定义了路由出口,同时定义了 ,我们希望路由连接的内容显示到当前组件中,那么连接的路径路由必须配置到当前组件路由下,如: ~~~json //配置路由信息 const routes=[ { path:"/", component:Login }, { path:"/main", //工作区组件路由 component:Main, //配置嵌套路由 children:[ { path:"/user", //用户列表显示在工作区组件 component:User } ] } ]; ~~~ ## Element UI 引入 > [官网地址](https://element-plus.gitee.io/zh-CN/) ### 安装 ~~~shell # NPM $ npm install element-plus --save ~~~ ### 完全引入 ~~~javascript import { createApp } from 'vue' //引入elementui import ElementPlus from 'element-plus' import 'element-plus/dist/index.css' import App from './App.vue' //创建vue组件 const app=createApp(App); //安装elementui app.use(ElementPlus); //挂载 app.mount("#app"); ~~~ # 参考 ## VSCode自定义代码块 第一步:点击文件-首选项-用户代码片段 ![img](assets/1620.png) 第二步:选择代码块作用域的文件类型 ![img](assets/1620-16612361398431.png) - **类型一:全局作用域** 这种类型的代码块是创建在vscode软件内部的文件。是跟随这当前安装的vscode这个软件的,不会随着项目的关闭而失效,会一直存在。 - **类型二:文件夹作用域** 这种类型的代码块是创建在某个文件下.vscode这个隐藏文件夹中的,这个代码块只适用于当前文件夹,出了这个文件夹就不能使用这个代码块了 - **类型三:特定文件类型作用域** 这种类型的代码块跟全局作用域的文件路径是一致的,都是创建在了vscode中,会一直存在。但是这种代码块只适合于你指定的文件类型。比如:如果你创建的是JavaScript类型,那这个代码块就不能再vue文件中使用。 **注意三种类型的代码块书写规范都是一致的** 第三步:代码块的书写   我们选择一种类型(我这里选择全局作用域类型),并且给这个文件起一个名字,   ps:名字随便起 ![img](assets/1620-16612361398432.png)  我们需要在这对大括号中书写我们的代码块,这里系统给了我们一个例子Example下方就是一个例子。下方是我自己书写的一个代码块 ![image-20220823142952752](assets/image-20220823142952752.png)   所有的代码段都必须写在最外层大括号中,每个代码块之间用逗号隔开,一个代码块就类似一个对象。   上方代码就是简单写了两个代码块。 接下来介绍每个属性的作用及方法。 **`scope:`**作用文件类型。就是代码块的作用文件类型,这里我们可以指定文件类型,多种类型之间用逗号隔开,   比如如果指定作用范围类型"css, javascript" 那么这个代码块只能在这两种类型的文件中起作用。   如果值为空,或者是不写这个属性,默认所有类型文件都支持该代码块。 **在特定文件类型中这个值是不起作用的,写了会报错,因为这种类型已经本身已经限制了文件类型** **`prefix:`** 触发代码块的字符串。写代码的时候我们只需敲出这个字符串就会触发我们的代码块。 **`body:`**代码块的主体内容。我们需要把我们的代码书写在这个属性中。仔细观察我们可以看出,代码块主体就是字符串的数组。 **`description:`**代码块的简单介绍,我们可以介绍一下这段代码块是干什么用的   **代码主体的书写规范:**   每个字符串元素就代表一行,行与行之间用 **`,`** 隔开表示换行。或者使用**`\n`**换行   行内不能使用tab键缩进,只能使用空格或者**`\t`**缩进   \1使用代码块敲击回车或者tab键后光标定位的位置。2 34...表示我们按下tab光标依次出现的位置 **第四步:代码块的使用** 使用代码块的方式非常简单,我们只需在想要书写的位置敲出触发我们代码块的关键字就行 **全局作用域的代码块:** ![img](assets/1620-16612361398434.png) ![img](assets/1620-16612361398435.png)