前端:Vue学习-2

前端:Vue学习-2

    • 1. vue的生命周期
    • 2. 工程化开发和脚手架Vue CLI
      • 2.1 组件化开发
      • 2.2 scoped解决样式冲突
      • 2.3 data是一个函数
      • 2.4 组件通信
      • 2.5 非父子通信- event bus事件,provide&inject
    • 3.v-model原理->实现父子组件双向绑定
    • 4. sync 修饰符->实现父子组件双向绑定
    • 5. ref 和 $refs
    • 6. Vue异步更新,$nextTick

1. vue的生命周期

Vue的生命周期,一个Vue实例从创建到销毁的整个过程。
生命周期的四个阶段为:创建、挂载、更新、销毁

  1. 创建阶段,把数据转化为响应式数据;
  2. 挂载阶段,渲染模板;
  3. 更新阶段,数据修改,更新视图;
  4. 销毁阶段

Vue生命周期函数(钩子函数)
请添加图片描述

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>vue2</title><script src="../vue2.js"></script>
</head>
<body><div id="app"><input type="text" v-model.number="count"><h4>{{count}}</h4></div><script>const app = new Vue({el:'#app',data:{count:100},beforeCreate(){console.log('before Create',this.count);},created(){console.log('created',this.count);},// 创建阶段beforeMount(){console.log('beforeMount',document.querySelector('h4').innerText);},mounted(){console.log('mounted', document.querySelector('h4').innerText);},// 挂载阶段beforeUpdate(){console.log('beforeUpdate', document.querySelector('h4').innerText);},updated(){console.log('updated', document.querySelector('h4').innerText);},// 更新阶段beforeDestroy(){console.log('beforeDestory');console.log('清除一些vue以外的资源占用,比如定时器等');},destroyed(){console.log('destoryed');}//销毁阶段})</script>
</body>
</html>

请添加图片描述

2. 工程化开发和脚手架Vue CLI

安装脚手架的命令,前提是本地电脑上已经安装nodejs,安装命令为:

npm install @vue/cli -g
// 全局安装
vue --version
// 查看安装的版本

在这里插入图片描述
创建vue项目为:

vue create 项目名

启动项目命令为:

// 首先需要cd到当前项目目录下
cd 项目名
npm run serve   // 启动项目

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

这个项目文件结构为:node_modules-第三方包目录,public-放html文件的目录,src-源代码目录,package.json-项目配置文件,jsconfig.json-js配置文件。。。src有个main.js文件,为项目的核心文件

import Vue from 'vue'
import App from './App.vue'Vue.config.productionTip = false// vue实例化
new Vue({// render: h => h(App),render:(createElement)=>{return createElement(App)}
}).$mount('#app')

2.1 组件化开发

一个页面可以拆分为一个个组件,每个组件可以拥有自己独立的结构、样式、行为,结构下有且只能有一个根元素。使样式支持less语法,需要安装less,npm命令为:

npm install less-loader

组件注册:局部注册、全局注册
局部注册,在components目录下新建“.vue”文件,文件命名采用大驼峰命名。然后在这个新建的vue文件下输入组件的三个组成部分,分别为结构、样式和行为。在App.vue根组件引入这个组件,并进行组测,然后就可以在根组件中使用这个组件了。

<script>
import Com from './components/Com.vue'export default {name: 'App',components: {Com:Com}
}
</script>

全局注册,在main.js中进行全局注册,==所有组件内均可以使用该组件 ==。

import Com from './components/Com.vue'Vue.component('Com',Com)
// 进行全局注册,对应的组件名,组件对象

2.2 scoped解决样式冲突

写在组件中的样式会全局生效,因此会造成多个组件之间的样式冲突。可以给组件的样式标签添加scoped属性,可以让样式只作用于当前组件。
在这里插入图片描述
加上scoped属性。

<style scoped>.com-1{width: 200px;height: 40px;background-color: red;}
</style>

在这里插入图片描述
实现原理:加上scoped之后,不同组件的标签元素上会自动添加上自定义属性“data-一个hash值”。
在这里插入图片描述

2.3 data是一个函数

一个组件的data选项必须使一个函数,可以保证每个组件实例,维护独立的一份数据对象。 每次创建新的组件实例,都会重新执行一次data函数,得到一个新对象。
Com组件:

<template><div class="com-1"><button @click="fn(-1)">-1</button>{{count}}<button @click="fn(1)">+1</button></div>
</template><script>
export default {name:'Com',data(){return{count:1}},methods:{fn(p){this.count += p;}}
}
</script><style scoped></style>
<template><div id="app"><Com></Com><br><Com></Com><br><Com></Com></div>
</template>

请添加图片描述

2.4 组件通信

父、子组件通信,父组件通过props将数据传递给子组件。在父组件中给子组件添加动态属性,属性值为父组件中的数据。在子组件中使用props来接收父组件传递来的数据。如果在子组件中想要修改这个父组件中的数据,可以通过this.$emit(‘父组件中传递的动态函数名’,要修改的值)
父组件:

<template><div id="app"><p>{{title}}</p><Com :count1="count" @changeCount="fn" @changeTitle="fn1"></Com></div>
</template>
<script>
export default {name: 'App',data(){return{count:1,title:'hello world!'}},methods:{fn(){this.count ++;},fn1(newTitle){this.title = newTitle;}}
}
</script>
<style>
</style>

子组件:

<template><div class="com-1"><p>{{count1}}</p><button @click="fn1">修改</button><br><button @click="fn2">修改名称</button></div>
</template><script>
export default {name:'Com',props:['count1'],methods:{fn1(){this.$emit('changeCount');},fn2(){this.$emit('changeTitle','hello Vue!');}}
}
</script><style></style>

请添加图片描述
可以传递任意数量的prop,传递任意类型的prop。

props校验
校验有类型校验、非空校验、默认值、自定义校验
类型校验如下:

props:{校验的属性名:类型
}
// 类型可以为Number、String、Boolean、

完整的校验为:

props:{校验的属性名:{type:类型,required:true,  // 是否必填default:默认值,validator(value){// 逻辑return 是否通过校验// return true或false}}
}

prop和data的区别
共同点:都可以给组件提供数据
区别:data的数据是组件本身的,可以随便改;prop的数据是外部的,不能直接改,要遵循单向数据流。

2.5 非父子通信- event bus事件,provide&inject

event bus事件
适用于兄弟组件。新建工具js文件,js文件代码如下:

import Vue from 'vue'const bus = new Vue();export default bus

在BaseA组件接收方代码如下:

<template><div>我是BaseA组件<p>{{count}}</p></div>
</template><script>
import bus from '../utils/bus'export default {name:'BaseA',data(){return {count:1}},created(){bus.$on('changeCount',(count)=>{this.count = count;})}
}
</script><style scoped>div{width: 200px;height: 100px;border: 1px solid black;}
</style>

BaseB组件发送方代码如下:

<template><div>我是组件BaseB <br><button @click="fn">修改组件BaseA中的值</button></div>
</template><script>
import bus from '../utils/bus'
export default {name:'BaseB',methods:{fn(){bus.$emit('changeCount',12);}}
}
</script><style scoped>div{width: 200px;height: 100px;border: 1px solid black;}
</style>

运行结果:
请添加图片描述
在组件接收方中通过bus.$on对事件进行监听,组件发送方通过bus.$emit使组件接收方中事件进行触发。这是一个一对多的关系,即一个发送方组件,可以有多个接收方组件进行监听。

provide&inject
跨层级共享数据,适用于祖孙组件,在祖先组件中使用provide进行数据共享,在子或孙组件中使用inject进行接收。需要注意的是如果数据是简单类型,那么为非响应式的;如果数据是复杂类型,那么为响应式的。
祖先组件代码如下:

import BaseS from './components/BaseS.vue'export default {name: 'App',data(){return{color:'red',person:{name:'liuze'}}},components:{BaseS},provide(){return{person:this.person,color:this.color}},methods:{fn(){this.color = 'blue';this.person.name = 'lz';}}
}

孙子组件代码如下:

<template><div class="son-s">孙子组件<p>{{color}}{{person.name}}</p></div>
</template><script>
export default {name:'BaseSS',inject:['color','person']
}
</script><style scoped>.son-s{border: 1px solid black;width: 100px;height: 100px;}
</style>

运行结果:
请添加图片描述

3.v-model原理->实现父子组件双向绑定

v-model本身是一个语法糖,应用在输入框上,就是value属性和input事件的合写。
数据变,视图跟着变“:value”;视图变,数据跟着变“@input”。

<input type="text" :value="val" @input="val = $event.target.value">

请添加图片描述

父子组件不能直接使用v-model的,因为v-model是双向数据绑定,而子组件是无法直接修改父组件中的数据的。如果要使用v-model,那么在子组件中对父组件中数据进行修改就必须使用“:value”及“input”,即 props:{value}和this.$emit(‘input’,更新的数据)
具体例子为:v-model原理:父组件、子组件使用v-model

4. sync 修饰符->实现父子组件双向绑定

可以实现子组件父组件数据的双向绑定,简化代码。prop属性名,可以自定义,非固定为value。使用场景,封装弹框类的基础组件。本质上就是 :属性名和@update:属性名 合写;如下的弹框父子组件如下:

<template><div class="diag" v-show="visible"><button @click="fn">X</button></div>
</template><script>
export default {props:{visible:Boolean},methods:{fn(){this.$emit('update:visible',false);}}
}
</script><style>.diag{width: 200px;height: 100px;border: 1px solid black;background-color: red;position: relative;}.diag button{position: absolute;top: 2px;right: 2px;width: 20px;height: 20px;line-height: 20px;text-align: center;}
</style>
<template><div id="app"><button @click="fn">取消修改</button><Diag :visible.sync="isShow" ></Diag></div>
</template>
<script>
import Diag from './components/Diag.vue'export default {name: 'App',components:{Diag},data(){return{isShow:false}},methods:{fn(){this.isShow = true;}}
}
</script>
<style scoped>
</style>

运行结果:
请添加图片描述

5. ref 和 $refs

利用ref和$refs可以用于获取dom元素或组件实例,查找范围为当前组件内。(如果dom进行查找,当其他组件和当前组件有同一个类名时,并且其他组件在当前组件前面进行渲染,那么此时就会出现dom找到的标签元素为其他组件内的。)

  1. 获取dom,在目标标签上添加ref属性
  2. 适当时机,通过this.$refs.xxx,获取目标标签
<div ref="div_1"></div>this.$refs.div_1
// 获取上述这个div标签
<template><div id="app"><div ref="div_1">哈哈</div></div>
</template>
<script>export default {name: 'App',data(){return{isShow:false}},methods:{fn(){this.isShow = true;}},mounted(){console.log(this.$refs.div_1);}
}
</script>
<style scoped>
</style>

运行结果:
在这里插入图片描述
如果要获取组件实例,直接在组件实例的标签上添加属性ref,之后就可以通过this.$refs.xxx获取这个组件,返回的是一个Vue组件对象,通过==this.$refs.xxx.组件方法()==调用这个组件下的方法。

6. Vue异步更新,$nextTick

下述是异步更新实例,因为Vue是异步更新的,所有点击编辑按钮之后,输入框并不会出现聚焦,所有需要使用到$nextTick

<template><div id="app"><div v-if="isShow"><span>{{v}}</span><button @click="edit">编辑</button></div><div v-else><input type="text" v-model="v" ref="inp"><button @click="save">保存</button></div></div>
</template>
<script>export default {name: 'App',data(){return{isShow:true,v:'北京'}},methods:{edit(){this.isShow = false;this.$nextTick(()=>{this.$refs.inp.focus();});},save(){this.isShow = true;}}
}
</script>
<style scoped>#app{width: 100px;height: 100px;margin: 20px auto;}
</style>

运行结果:
请添加图片描述

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

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

相关文章

PyTorch垃圾分类任务与垃圾图片数据集

新书速览|PyTorch深度学习与企业级项目实战-CSDN博客 人工智能用于垃圾分类 人工智能用于垃圾分类&#xff0c;业界早有过相关的讨论&#xff0c;主要有三种方案&#xff1a;第一种方案&#xff0c;把垃圾的相关信息制成表格化数据&#xff0c;然后用传统的机器学习方法实现分…

服务客户,保证质量:腾讯云产品的质量实践

分享主题是“服务客户&#xff0c;保证质量”。自从20年开始&#xff0c;我们把质量提升到了一个前所未有的高度。为什么会如此重视质量呢&#xff1f;在竞争激烈和复杂的市场环境中&#xff0c;产品质量对于企业的重要性不言而喻。一旦出现了质量事故&#xff0c;对客户和企业…

PublicCMS:企业级的Java CMS系统

PublicCMS&#xff1a;企业级的Java CMS系统 在当今互联网飞速发展的时代&#xff0c;PublicCMS作为一款功能强大的开源Java CMS系统&#xff0c;为用户提供了全面的建站解决方案。本文将介绍PublicCMS的基本信息、特点以及如何快速部署和使用。 软件简介 PublicCMS是一款现代…

Visual Studio 2022美化

说明&#xff1a; VS版本&#xff1a;Visual Studio Community 2022 背景美化 【扩展】【管理扩展】搜索“ClaudiaIDE”&#xff0c;【下载】&#xff0c;安装完扩展要重启VS 在wallhaven下载壁纸图片作为文本编辑器区域背景图片 【工具】【选项】搜索ClaudiaIDE&#xff…

如何判断c盘d盘e盘哪个是固态硬盘

怎么区分电脑里面的C盘、D 盘、E盘是机械硬盘还是固态硬盘&#xff1f;在电脑里&#xff0c;硬盘是存储数据的核心部件&#xff0c;负责存储操作系统、软件以及用户数据。硬盘的性能也会影响电脑的流畅度。平时我们最常使用的硬盘分为机械硬盘和固态硬盘。在日常使用中&#xf…

Python酷库之旅-第三方库Pandas(032)

目录 一、用法精讲 91、pandas.Series.set_flags方法 91-1、语法 91-2、参数 91-3、功能 91-4、返回值 91-5、说明 91-6、用法 91-6-1、数据准备 91-6-2、代码示例 91-6-3、结果输出 92、pandas.Series.astype方法 92-1、语法 92-2、参数 92-3、功能 92-4、返回…

​1:1公有云能力整体输出,腾讯云“七剑”下云端

【全球云观察 &#xff5c; 科技热点关注】 曾几何时&#xff0c;云计算技术的兴起&#xff0c;为千行万业的数字化创新带来了诸多新机遇&#xff0c;同时也催生了新产业新业态新模式&#xff0c;激发出高质量发展的科技新动能。很显然&#xff0c;如今的云创新已成为高质量发…

液氮罐搬运过程中的安全注意事项有哪些

在液氮罐搬运过程中&#xff0c;安全性是至关重要的考虑因素。液氮是一种极低温的液体&#xff0c;其温度可达零下196摄氏度&#xff0c;在接触到人体或物体时会迅速引发严重的冷冻伤害。因此&#xff0c;正确的搬运和使用液氮罐是保障操作安全的关键。 液氮是一种无色、无味的…

RK3568笔记四十:设备树

若该文为原创文章&#xff0c;转载请注明原文出处。 一、介绍 设备树 (Device Tree) 的作用就是描述一个硬件平台的硬件资源&#xff0c;一般描述那些不能动态探测到的设备&#xff0c;可以被动态探测到的设备是不需要描述。 设备树可以被 bootloader(uboot) 传递到内核&#x…

分布式服务框架zookeeper+消息队列kafaka

一、zookeeper概述 zookeeper是一个分布式服务框架&#xff0c;它主要是用来解决分布式应用中经常遇到的一些数据管理问题&#xff0c;如&#xff1a;命名服务&#xff0c;状态同步&#xff0c;配置中心&#xff0c;集群管理等。 在分布式环境下&#xff0c;经常需要对应用/服…

项目的一些操作

一、发送qq邮箱验证码以及倒计时 要发送验证码需要用到邮箱的授权码&#xff1a; qq邮箱获取方式&#xff0c;打开qq邮箱点设置找到如下界面&#xff1a; 然后获取授权码&#xff1b; 导入依赖 <dependency><groupId>com.sun.mail</groupId><artifactId&…

LeetCode 算法:单词搜索 c++

原题链接&#x1f517;&#xff1a;单词搜索 难度&#xff1a;中等⭐️⭐️ 题目 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通…

详解MLOps,从Jupyter开发到生产部署

大家好&#xff0c;Jupyter notebook 是机器学习的便捷工具&#xff0c;但在应用部署方面存在局限。为了提升其可扩展性和稳定性&#xff0c;需结合DevOps和MLOps技术。通过自动化的持续集成和持续交付流程&#xff0c;可将AI应用高效部署至HuggingFace平台。 本文将介绍MLOps…

kotlin compose 实现应用内多语言切换(不重新打开App)

1. 示例图 2.具体实现 如何实现上述示例,且不需要重新打开App ①自定义 MainApplication 实现 Application ,定义两个变量: class MainApplication : Application() { object GlobalDpData { var language: String = "" var defaultLanguage: Strin…

Linux TFTP服务搭建及使用

1、TFTP 服务器介绍 TFTP &#xff08; Trivial File Transfer Protocol &#xff09;即简单文件传输协议是 TCP/IP 协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议&#xff0c;提供不复杂、开销不大的文件传输服务。端口号为 69 2、TFTP 文件传输的特点 tftp…

3、宠物商店智能合约实战(truffle智能合约项目实战)

3、宠物商店智能合约实战&#xff08;truffle智能合约项目实战&#xff09; 1-宠物商店环境搭建、运行2-webjs与宠物逻辑实现3-领养智能合约初始化4-宠物领养实现5-更新宠物领养状态 1-宠物商店环境搭建、运行 https://www.trufflesuite.com/boxes/pet-shop 这个还是不行 或者…

ArkUI状态管理

State装饰器 在声明式UI中&#xff0c;是以状态驱动试图更新 状态 (State) 指驱动视图更新的数据(被装饰器标记的变量) 试图(View) 基于UI描述渲染得到用户界面 说明 1.State装饰器标记的变量必须初始化&#xff0c;不能为空 2.State支持Object、classstring、number、b…

[Vulnhub] devt-improved slog_users+vim权限提升+nano权限提升+passwd权限提升+Lxc逃逸权限提升

信息收集 IP AddressOpening Ports192.168.101.149TCP:22,113,139,445,8080 $ nmap -p- 192.168.101.149 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | …

9.11和9.9哪个大?GPT-4o也翻车了

今天刷到了这个问题&#xff0c;心血来潮去问下chatgpt-4o&#xff0c;没想到疯狂翻车... 第一次问&#xff1a; GPT一开始给出了难绷的解答&#xff0c;让我想起了某短视频软件评论区里对某歌手节目排名的质疑哈哈哈哈哈 但是在接下来的进一步询问和回答中它反应过来了。 第…

JavaWeb笔记_Response对象

一.Response对象 1.1 Response对象概述 a.专门负责给浏览器响应信息&#xff08;响应行&#xff0c;响应头&#xff0c;响应体&#xff09;的对象 b.我们主要使用的是跟HTTP协议相关的Response对象&#xff1a;HTTPServletResponse&#xff0c;继承了ServletResponse&#x…