Vue学习笔记--004

news2024/12/23 17:26:49

Vue学习

一、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.coloradmin.cn/o/893876.html

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

相关文章

简单的洗牌算法

目录 前言 问题 代码展现及分析 poker类 game类 Text类 前言 洗牌算法为ArrayList具体使用的典例&#xff0c;可以很好的让我们快速熟系ArrayList的用法。如果你对ArrayList还不太了解除&#xff0c;推荐先看本博主的ArrayList的详解。 ArrayList的详解_WHabcwu的博客-CSD…

nn.embedding会被反向传播更新吗?

https://developer.aliyun.com/article/1191215 这样是不可更新&#xff0c;但被我注释掉了。

【C++ 学习 ⑭】- 详解 stack、queue 和 priority_queue 容器适配器

目录 一、详解 C STL 容器适配器 1.1 - 什么是容器适配器&#xff1f; 1.2 - 容器适配器的种类 二、详解 C STL deque 容器 2.1 - deque 的原理介绍 2.2 - deque 的优缺点 三、详解 stack 容器适配器 3.1 - stack 的基本介绍 3.2 - stack 的成员函数 3.3 - stack 的模…

live555在Windows WSL2中编译、运行,搭建RTSP流服务器

文章目录 1. 背景2. 实施步骤2.1 下载live555安装包2.2 解压压缩包2.3 编译源码2.3 安装ffmpeg2.4 安装opencv-python2.5 视频文件格式转换2.6 启动推流2.6 安装VLC&#xff0c;验证 3. 用opencv-python接口接收视频流参考 1. 背景 想要通过RTSP往opencv的接口中推流&#xff…

富文本中的参数如何设置大小?

富文本里如果直接显示的数据可以随意调节大小,颜色等格式. 但是如果数据是动态的参数 就无法随意设置参数的格式了.当字数过多时就会出现显示不全,有没有大佬知道如何解决? wangEditor set HTML

Flink 数据集成服务在小红书的降本增效实践

摘要&#xff1a;本文整理自实时引擎研发工程师袁奎&#xff0c;在 Flink Forward Asia 2022 数据集成专场的分享。本篇内容主要分为四个部分&#xff1a; 小红书实时服务降本增效背景Flink 与在离线混部实践实践过程中遇到的问题及解决方案未来展望 点击查看原文视频 & 演…

【学习笔记之vue】These dependencies were not found:

These dependencies were not found:方案一 全部安装一遍 我们先浅试一个axios >> npm install axios 安装完报错就没有axios了&#xff0c;验证咱们的想法没有问题&#xff0c;实行&#xff01; ok

chapter 3 Free electrons in solid - 3.2 量子自由电子理论对一些现象的解释

3.2 自由电子气的热容 Heat capacity of free electron gas 3.2.1 计算自由电子的热容 Calculation of Heat Capacity of free Electrons T>0K, total energy of free electrons: E ∫ E d N 3 5 N e E F 0 [ 1 5 12 π 2 ( k B T E F 0 ) 2 ] E \int EdN \frac{3}{5}…

Unable to find resource t64.exe in package pip._vendor.distlib报错问题解决

Unable to find resource t64.exe in package pip._vendor.distlib报错问题解决 问题报错具体内容具体解决方案解决方法一解决方法二 问题报错具体内容 想要对python的版本进行一个升级,使用如下语句 python -m pip install --upgrade pip出现如下报错 Unable to find reso…

四维轻云场景更新之后,如何快速搭建场景?

「四维轻云」是一款轻量化的地理空间数据管理云平台&#xff0c;支持地理空间数据的在线管理、编辑以及分享。平台提供了项目管理、数据上传、场景搭建、发布分享、素材库等功能模块&#xff0c;支持团队多用户在线协作管理。 四维轻云平台是以项目的形式进行数据管理&#xf…

vue2中常用的组件封装技巧

文章目录 vue组件封装技巧1.props参数2.$attrs3.$emit4.$listeners5.插槽 vue组件封装技巧 1.props参数 最简单父传子的技巧&#xff0c;在父组件传入值&#xff0c;子组件声明props接收就可以了 如下&#xff1a; 父组件&#xff1a; <template><div id"ap…

两图看懂什么叫回调函数,使用回调函数实现多态

#include <stdio.h> //任务函数可以增加&#xff0c;任务使用框架函数保持不变&#xff0c;根据传入函数指针的不同调用不同的任务函数&#xff0c;从而实现了多态 //编写任务函数&#xff0c;任务函数可以增加 int Myadd1(int a, int b) { return ab; } int Mymux2(i…

Git 设置代理

Git 传输分两种协议&#xff0c;SSH和 http(s)&#xff0c;设置代理也需要分两种。 http(s) 代理 Command Line 使用 命令行 模式&#xff0c;可以在Powershell中使用以下命令设置代理&#xff1a; $env:http_proxy"http://127.0.0.1:7890" $env:https_proxy&quo…

【LeetCode】买卖股票的最佳时机最多两次购买机会

买卖股票的最佳时机 题目描述算法分析程序代码 链接: 买卖股票的最佳时机 题目描述 算法分析 程序代码 class Solution { public:int maxProfit(vector<int>& prices) {int n prices.size();vector<vector<int>> f(n,vector<int>(3,-0x3f3f3f))…

【从零学习python 】48.Python中的继承与多继承详解

文章目录 在Python中&#xff0c;继承可以分为单继承、多继承和多层继承。单继承 继承语法多继承 语法格式使用多继承时需要注意以下事项Python中的MRO新式类和旧式&#xff08;经典&#xff09;类 进阶案例 在Python中&#xff0c;继承可以分为单继承、多继承和多层继承。 单…

.NET把文件嵌入到程序集中的EmbeddedFile

简介 有时候我们在发布程序时&#xff0c;不想让客户看到项目中的文件&#xff0c;这时就可以使用.NET的嵌入文件功能&#xff08;虚拟文件&#xff09;。在.NET中&#xff0c;虚拟文件&#xff08;Virtual File&#xff09;是一种特殊类型的文件&#xff0c;它们在编译时被嵌…

手把手教你用Git备份保存代码到云端

第一步 &#xff1a;创建一个Gitee仓库,需要先下载安装git,在下载安装完成后&#xff0c;我们需要首先去Gittee官网上创建一个仓库 路径会自动生成&#xff0c;点击创建即可 第二步&#xff1a; 方法一&#xff1a;用图形化界面&#xff08;方便&#xff09; 下载&#xff…

听说换上人大金仓“自动挡”,效率提升4000多倍!

前情提要 随着数据规模以及应用业务场景复杂度的不断增加&#xff0c;更大规模数据量的数据库应用场景出现&#xff0c;对于传统关系型数据库的优化能力要求也更高。 因为SQL是解释性语言&#xff0c;用户可以指定要什么&#xff0c;而无需关心如何达成目的。所以对于同样一条S…

录取结果怎么公布?这个技术可以轻松实现

对于录取结果的公布&#xff0c;一直是考生和家长重点关注的话题&#xff0c;因此学校公布录取情况的方式和效果也一直是学校工作的重点和难点&#xff0c;传统的公布方式涉及技术开发和服务器搭建&#xff0c;开发周期也较长&#xff01;一般有经验的老教师都会选择使用易查分…

分布式 - 消息队列Kafka:Kafka 消费者消费位移的提交方式

文章目录 1. 自动提交消费位移2. 自动提交消费位移存在的问题&#xff1f;3. 手动提交消费位移1. 同步提交消费位移2. 异步提交消费位移3. 同步和异步组合提交消费位移4. 提交特定的消费位移5. 按分区提交消费位移 4. 消费者查找不到消费位移时怎么办&#xff1f;5. 如何从特定…