前端技术Vue学习笔记--004

Vue学习

文章目录

  • Vue学习
    • 一、scoped解决样式冲突
    • 二、data必须是一个函数
    • 三、组件通信
      • 3.1、组件关系
      • 3.2、组件通信解决方案
      • 3.3、父传子通信
      • 3.4、子传父通信
      • 3.5、组件通信案例
    • 四、prop语法
      • 4.1、prop语法基础语法
      • 4.2、 <font color = blue>prop校验
      • 4.3、prop&data、单向数据流

一、scoped解决样式冲突

写在组件中的样式会 全局生效 → 因此很容易造成多个组件之间的样式冲突问题。

  1. 全局样式: 默认组件中的样式会作用到全局,任何一个组件中都会受到此样式的影响

  2. 局部样式: 可以给组件加上scoped 属性,可以 让样式只作用于当前组件

scoped原理:

  1. 给当前组件模版的所有元素,都会被添加上一个自定义属性 data-v-hash值 (如:data-v-5f6a9d56)
  2. css选择器后面,被自动处理。添加上了[data-v-hash值]的属性选择器(如:div[data-v-5f6a9d56])

最终效果必须是当前组件的元素,才会有这个自定义属性,才会被这个样式作用到。

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

二、data必须是一个函数

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

在这里插入图片描述
BaseCount.vue

<template><div class="baseCount"><button v-on:click="count--" v-show="count >0">-</button><span>{{count}}</span><button @click="count++">+</button></div>
</template><script>
export default {//data()函数与data:达成的效果一样//data必须是一个函数 --->保证每个组件实例,维护独立的一个数据对象data(){console.log("1111")return {count:999}}
}
</script>
<style>
</style>

App.vue

<template><div class="app"><BaseCount></BaseCount><BaseCount></BaseCount><BaseCount></BaseCount></div>
</template><script>//导入相关组件import BaseCount from './components/BaseCount.vue'
export default {name: 'app',components: {BaseCount : BaseCount}
}
</script><style></style>

效果
在这里插入图片描述

三、组件通信

组件通信:就是指组件与组件之间的数据传递

  • 组件中的数据是独立的,无法直接访问其它组件的数据
  • 想用其他组件的数据-------组件通信

3.1、组件关系

在这里插入图片描述

3.2、组件通信解决方案

3.3、父传子通信

  1. 父组件通过props将数据传递给子组件
  2. 子组件利用$emit通知父组件修改更新

在这里插入图片描述
通信步骤:

  • 在父组件中,给组件标签,添加属性方式,传值
  • 在子组件通过props进行接收
  • 在子组件中渲染使用

App.vue

<template><div class="app">myData: {{myData}}<!-- 父传子组件通信 --><!-- 1.给组件标签,添加属性方式,传指 --><BaseSon v-bind:title="myData"></BaseSon></div>
</template><script>//导入子组件
import BaseSon from './components/BaseSon.vue'
export default {name: 'app',components: {BaseSon : BaseSon},data(){return {myData  : 'radan学习Vue知识'}}
}
</script><style scoped>
</style>

BaseSon.vue

<template><div class="son" ><!-- 3.在子组件中渲染使用 -->{{title}}</div>
</template><script>
export default {// 2.通过props进行接受props:['title']}
</script><style scoped>div{border: 3px solid pink;margin: 10px;width: 260px;height: 60px;}
</style>

测试
在这里插入图片描述

3.4、子传父通信

通信步骤:

  1. 通过$emit,向父组件发生消息通知(需要在方法中编写
  2. 父组件要对子组件发送的消息进行监听
  3. 父组件提供处理函数

App.vue

<template><div class="app">myData: {{myData}}<!-- 2. 父组件要对子组件发送的消息进行监听 --><BaseSon v-bind:title="myData" @changeTitle="handleChange"></BaseSon></div>
</template><script>import BaseSon from './components/BaseSon.vue'
export default {name: 'app',components: {BaseSon : BaseSon},data(){return {myData  : 'radan学习Vue知识'}},methods:{// 3. 提供处理函数handleChange(newTitle){// alert(newTitle)this.myData=newTitle}}
}
</script><style scoped>
</style>

BaseSon.vue

<template><div class="son" >我是Son组件<button @click="changeFn()">修改父组件中的数据</button></div>
</template><script>
export default {props:['title'],methods:{changeFn(){// alert("你好")// 1. 通过$emit,向父组件发生消息通知this.$emit('changeTitle','randa不想学习')}}}
</script><style scoped>div{border: 3px solid pink;margin: 10px;width: 260px;height: 60px;}
</style>

测试
在这里插入图片描述

3.5、组件通信案例

小黑记事本--------------组件版

需求说明:
在这里插入图片描述
App.vue

<template><!-- 主体区域 --><section id="app"><TodoHeader @addProject="addProject" ></TodoHeader><!-- 将list中的数据提供给todoMain组件 --><TodoMain :list="list" @changeDel="changeDel"  ></TodoMain><TodoFooter :list="list" @delAll="delAll" v-show=" list.length>0"></TodoFooter></section>
</template><script>
import TodoFooter from './components/TodoFooter.vue'
import TodoHeader from './components/TodoHeader.vue'
import TodoMain from './components/TodoMain.vue'
//A:渲染功能://  1. 提供数据-->提供在公共的父组件中//  2. 通过父传子,将数据传递给其他组件//  3. 利用 v-for 渲染 /*** B:添加功能*      1.收集表单数据 --> v-model*      2.监听事件(回车+点击 都要进行添加)*      3.子传父将任务名称传递给父组件*      4.进行添加 unshift(自己的数据自己负责)*//*** C:删除功能*      1.监听事件(监听删除的点击)携带id*      2.子传父,将删除的id传递给父组件App.vue*      3.进行删除 filter(自己的数据自己负责)*//***  D:footer功能*      1.底部合计:父传子list--->渲染*      2.清空功能:子传父,父修改*      3.持久化存储:watch深度监视list的变化-->往本地存储 --->进入页面优先读取本地信息*/
export default {components:{TodoFooter:TodoFooter,TodoHeader:TodoHeader,TodoMain:TodoMain},data(){return {//优先读取本地信息list:JSON.parse(localStorage.getItem('list')) || [{id:1,name: '打篮球'},{id:2,name: '打羽毛球'},{id:3,name: '看电影'}]}},methods:{changeDel(id){//按照id删除数组中的元素this.list = this.list.filter(item => (item.id != id))},addProject(value){//向数组添加一个元素this.list.unshift({id  : +new  Date(),name : value})},delAll(){//清空数组中的所有元素this.list=[]// alert(this.list)}},watch:{list:{deep: true,handler(newValue){localStorage.setItem('list',JSON.stringify(newValue))}}}}
</script><style></style>

ToDoHeader.vue

<template><!-- 输入框 --><header class="header"><h1>小黑记事本</h1><input placeholder="请输入任务" class="new-todo" v-model="inputInfo" /><button class="add" @click="addProject">添加任务</button></header>
</template><script>
export default {data(){return{inputInfo: ''  //和表单的输入框进行数据绑定}},methods:{addProject(){if(this.inputInfo.trim() === ''){alert("添加的元素不能为空")return}else{this.$emit('addProject',this.inputInfo)this.inputInfo=''}}}
}
</script><style></style>

ToDOMain.vue

<template><!-- 列表区域 --><section class="main"><ul class="todo-list" v-for="(item,index) in list" :key="item.id"><li class="todo"><div class="view"><span class="index">{{index +1 }}</span> <label>{{item.name}}</label><button @click="del(item.id)" class="destroy"></button></div></li></ul></section>
</template><script>
export default {props:{list:Array},methods:{del(value){// console.log(value)this.$emit('changeDel',value)}}}
</script><style></style>

ToDoFooter.vue

<template>
<!-- 统计和清空 --><footer class="footer"><!-- 统计 --><span class="todo-count">合 计:<strong> {{list.length}} </strong></span><!-- 清空 --><button class="clear-completed" @click="delAll">清空任务</button></footer>
</template><script>
export default {props:{list:Array},methods: {delAll(){//子传父this.$emit('delAll')}}
}
</script><style></style>

四、prop语法

4.1、prop语法基础语法

  1. prop

定义组件上注册的一些自定义属性
作用向子组件传递数据

特点:

  • 可以传递   任意数量   的prop
  • 可以传递   任意类型   的prop
    在这里插入图片描述

4.2、 prop校验

思考:组件的prop可以乱传?
作用:为组件的prop指定验证要求,不符合要求,控制台就会有错误提示。----->帮助开发者,快速发现错误。

校验语法:

  • 类型校验

数据类型校验:将props数组的形式改为对象的形式

//数据类型校验:将props数组的形式改为对象的形式// props:['title']props:{title: String  //String Boolean Array Object Function等等},
  • 非空校验
  • 默认值
  • 自定义校验
  //2.完整写法props:{title: {type: String,//类型校验required: true,  //必传属性:父传子的属性没有传就会报错default: 'hello radan',//默认值属性:当父组件组没有自定义属性绑定的时候,就会按照默认值进行处理//自定义校验validator(value){console.log(value)//对当前的title对应的value是否符合一定的条件return true;}}

注意:validator(value)中的value形参就是父组件传递过来的值

4.3、prop&data、单向数据流

prop&data中谁的数据谁负责

共同点:都可以给组件提供数据。
区别:

  • prop 的数据是外部的 → 不能直接改,要遵循 单向数据流
  • data 的数据是自己的 → 随便改

单向数据流父级props 的数据更新,会向下流动,影响子组件。这个数据流动是单向的

子组件修改props中的数据

App.vue

<template><div class="app"><BaseCount :title="myData" @changeCount="changeFn"></BaseCount></div>
</template><script>import BaseCount from './components/BaseCount.vue'
export default {name: 'app',components: {BaseCount : BaseCount},data(){return {myData  : 1}},methods:{changeFn(value){// alert(value)this.myData=value}}
}
</script><style scoped>
</style>

BaseCount.vue

<template><div class="baseCount"><button v-on:click="countSub" v-show="title >0">-</button><span>{{title}}</span><button @click="countAdd">+</button></div>
</template><script>
export default {//  1. data中的数据可以在当前组件中随便改// data(){//     return {count:999}// }//  2. props中的数据的修改办法:props:{title:Number},methods:{countAdd(){this.$emit('changeCount',this.title+1)},countSub(){this.$emit('changeCount',this.title-1)}// ,// isTrue(value){//   console.log(value)//   if(value>0)//     {//       return true//     }// }}
}
</script><style>
</style>

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

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

相关文章

rabbitMQ服务自动停止(已解决

1、 在rabbitmq的sbin目录下操作 rabbitmq-plugins enable rabbitmq_management 2、 自己去rabbitmq_server-3.7.5文件夹下创建一个data&#xff0c;再执行这个命令&#xff08;用自己的目录哈 set RABBITMQ_BASED:\RabbitTools\RabbitMQ\rabbitmq_server-3.7.5\data 然后去配…

SOLIDWORKS有限元分析

SOLIDWORKS是一款广泛使用的三维计算机辅助设计软件&#xff0c;同时它还具有强大的有限元分析功能。有限元分析是一种工程分析方法&#xff0c;它将复杂的实体分解成许多小的有限元素&#xff0c;以便对其进行数学建模和分析。SOLIDWORKS的有限元分析功能可以帮助工程师预测和…

vue3和vue2 语法差异之v-model详细说明

文章目录 0.前言1.参考文档2.详细说明介绍2.x 语法使用 v-bind.sync 3.x 语法v-model 参数v-model 修饰符 迁移策略 3.总结 0.前言 在 Vue 3 中&#xff0c;v-model 的使用方式与 Vue 2 有一些差异。下面是 Vue 3 中 v-model 的一些主要变化&#xff1a; 组件上的默认绑定&…

【卷积神经网络】卷积,池化,全连接

随着计算机硬件的升级与性能的提高&#xff0c;运算量已不再是阻碍深度学习发展的难题。卷积神经网络&#xff08;Convolution Neural Network&#xff0c;CNN&#xff09;是深度学习中一项代表性的工作&#xff0c;CNN 是受人脑对图像的理解过程启发而提出的模型&#xff0c;其…

从零基础到精通IT:探索高效学习路径与成功案例

文章目录 导语&#xff1a;第一步&#xff1a;明确学习目标与方向选择适合的IT方向设定具体的学习目标咨询和调研 第二步&#xff1a;系统学习基础知识选择适合的编程语言学习数据结构和算法掌握操作系统和计算机网络基础 第三步&#xff1a;实践项目锻炼技能选择合适的项目编写…

-Webkit-Box 在 Safari 中出现的兼容性问题

一、问题背景&#xff1a; UI要求要实现这样的效果&#xff0c;使用 display:-webket-box在chrome浏览器下完美解决 但是马上啪啪打脸&#xff0c;在safari浏览器下显示空白 &#xff0c;不能不说浏览器之间的兼容性简直就是天坑 二、解决办法 通过浏览器调试发现原本float的…

探索性测试及基本用例

1 测试决策5要素 测试目标&#xff1a;所有的重要任务都完成了&#xff0c;而剩下没做的事情是比较次要的&#xff0c;我们做到这一点就可以尽早尽可能地降低发布风险。 测试方法&#xff1a;测试是一个不断抉择的过程&#xff0c;测试人员必须理解运行测试用例时和分析现有信…

Java算法_ 二叉树的最大深度(LeetCode_Hot100)

题目描述&#xff1a;给定一个二叉树 &#xff0c;返回其最大深度。root 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 获得更多&#xff1f;算法思路:代码文档&#xff0c;算法解析的私得。 运行效果 完整代码 /*** 2 * Author: LJJ* 3 * Date: 2023/…

去年校招面试中Hadoop高频都问些什么?秋招在即,快收藏!

1 总述 校招是远不同于社招的&#xff0c;企业对学生的要求更多的是一些概念性的东西&#xff0c;即所谓的八股文。但有些场景类的题目也是会涉及到&#xff0c;尤其是在一些中大厂的面试题中。场景题固然是能不能中大厂中必不可少的部分&#xff0c;但是基础牢不牢才是能不能…

idea如何建立web项目???

我们需要用到tomcat&#xff0c;没有下在着小伙伴&#xff0c;可以借鉴这篇博客&#xff1a; 如何正确下载tomcat&#xff1f;&#xff1f;&#xff1f;_明天更新的博客-CSDN博客 1.建立普通的Java项目。 2.简单编写index.jsp文件 3.添加tomcat 4.运行服务器 5.构建Servlet 最后…

如何优雅做好项目管理?

导言 项目本身无好坏之分&#xff0c;项目管理有做好与做坏之别。在互联网大厂的体制下&#xff0c;想要做坏一个项目很难&#xff08;可以通过换人、追加资源等方式消除风险&#xff09;&#xff0c;想要做好一个项目不容易&#xff0c;需要团队及PM付出大量心血和精力。在这…

【数据结构】树和二叉树

一、树的概念及结构 1、树的概念 树 是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结点&a…

基于C#的消息处理的应用程序 - 开源研究系列文章

今天讲讲基于C#里的基于消息处理的应用程序的一个例子。 我们知道&#xff0c;Windows操作系统的程序是基于消息处理的。也就是说&#xff0c;程序接收到消息代码定义&#xff0c;然后根据消息代码定义去处理对应的操作。前面有一个博文例子( C#程序的启动显示方案(无窗口进程发…

HTTP响应状态码大全:从100到511,全面解析HTTP请求的各种情况

文章目录 前言一、认识响应状态码1. 什么是HTTP响应状态码2. Http响应状态码的作用3. 优化和调试HTTP请求的建议 二、1xx 信息响应1. 认识http信息响应2. 常见的信息响应状态码 三、2xx 成功响应1. 认识HTTP成功响应2. 常见的成功响应状态码 四、3xx 重定向1. 认识http重定向2.…

mysql从传统模式切到GTID模式后启动主从,主从异常报错1236

一 前言 MySQL 的主从复制作为一项高可用特性&#xff0c;用于将主库的数据同步到从库&#xff0c;在维护主从复制数据库集群的时候&#xff0c;作为专职的MySQL DBA&#xff0c;笔者相信大多数人都会遇到“Got fatal error 1236 from master when reading data from binary …

日常BUG——SpringBoot关于父子工程依赖问题

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;日常BUG、BUG、问题分析☀️每日 一言 &#xff1a;存在错误说明你在进步&#xff01; 一、问题描述 在父子工程A和B中。A依赖于B&#xff0c;但是A中却无法引入B中的依赖&#xff0c;具体出现的…

全自动模拟量采集软件框架详解

Monitor.Analog采用一种MVVM架构模式&#xff0c;用于将用户界面&#xff08;View&#xff09;与业务逻辑&#xff08;Model&#xff09;进行分离&#xff0c;并通过ViewModel来进行连接和交互。以下是MVVM框架的介绍&#xff1a; 1. Model&#xff08;模型&#xff09;&#x…

【CTF-web】buuctf-[极客大挑战 2019]EasySQL 1(sql注入)

题目链接 根据题目判断出可能需要sql注入&#xff0c;看源码可知数据是通过GET的方式传输的&#xff0c;即放在url的username和password两个参数中。 只要将username输入为1 or 11#&#xff0c;password可以为任何值&#xff0c;即可顺利登录。 需要注意的是url中的井号表示…

【腾讯云 Cloud Studio 实战训练营】在线 IDE 编写 canvas 转换黑白风格头像

关于 Cloud Studio Cloud Studio 是基于浏览器的集成式开发环境(IDE)&#xff0c;为开发者提供了一个永不间断的云端工作站。用户在使用Cloud Studio 时无需安装&#xff0c;随时随地打开浏览器就能在线编程。 Cloud Studio 作为在线IDE&#xff0c;包含代码高亮、自动补全、Gi…

8.深浅拷贝和异常处理

开发中我们经常需要复制一个对象。如果直接用赋值会有下面问题: 8.1 浅拷贝 首先浅拷贝和深拷贝只针对引用类型 浅拷贝&#xff1a;拷贝的是地址 常见方法: 1.拷贝对象&#xff1a;Object.assgin() / 展开运算符{…obj} 拷贝对象 2.拷贝数组&#xff1a;Array.prototype.con…