Vue3【计算属性、Class绑定、Style绑定 、侦听器、表单输入绑定、模板引用、组件注册方式、组件嵌套关系 、组件注册方式】(三)-全面详解(学习总结---从入门到深化)

news2025/1/18 7:03:32

👏作者简介:大家好,我是小童,Java开发工程师,CSDN博客博主,Java领域新星创作者
📕系列专栏:前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
🍂博主正在努力完成2023计划中:以梦为马,扬帆起航,2023追梦人 

目录

计算属性

侦听器

表单输入绑定 

模板引用 

组件组成 

组件嵌套关系 

创建组件及引用关系 

组件注册方式


计算属性

模板中的表达式虽然方便,但也只能用来做简单的操作。如果在模板中写太多逻辑,会让模板变得臃肿,难以维护。因此我们推荐使用计算属性来描述依赖响应式状态的复杂逻辑 

<template>
    <div>
        <h3>{{ ittxc.name }}</h3>
        <p>{{ ittxc.content.length > 0 ? 'Yes' : "No" }}</p>
    </div>
</template>
<script>
  export default {
    data(){
        return{
            ittxc:{
                name:"xiaotong",
                content:["前端","Java","python"]
           }
       }
   }
}
</script>

 应用计算属性

<template>
    <div>
        <h3>{{ itxiaotong.name }}</h3>
        <p>{{ getReadBook }}</p>
    </div>
</template>
<script>
export default {
    data(){
        return{
            itxiaotong:{
                name:"xiaotong",
                content:["前端","Java","python"]
           }
       }
   },
    computed:{
        getReadBook(){
           return this.itxiaotong.content.length > 0 ? 'Yes' : "No"
       }
   }
}
</script>

计算属性缓存 vs 方法

你可能注意到我们在表达式中像这样调用一个函数也会获得和计算属性相同的结果

<template>
    <div>
        <h3>{{ itxiaotong.name }}</h3>
        <p>{{ getReadBook() }}</p>
    </div>
</template>
<script>
  export default {
    data(){
        return{
            itxiaotong:{
                name:"童小纯",
                content:["前端","Java","python"]
           }
       }
   },
    methods:{
        getReadBook(){
             return this.itxiaotong.content.length > 0 ? 'Yes' : "No"
       }
   }
}
</script>

重点区别:

计算属性:计算属性值会基于其响应式依赖被缓存。一个计算 属性仅会在其响应式依赖更新时才重新计算

方法:方法调用总是会在重渲染发生时再次执行函数

实时效果反馈

1. 下列那个是计算属性关键字:

A data

B methods

C computed

D vue 

Class绑定 

数据绑定的一个常见需求场景是操纵元素的 CSS class 列表,因为 class 是 attribute,我们可以和其他 attribute 一样使用 v-bind 将它们和动态的字符串绑定。但是,在处理比较复杂的绑定时,通过拼接生成字符串是麻烦且易出错的。因此,Vue 专门为 classv-bind 用法提供了特殊的功能增强。除了字符串外,表达式的值也可以是 对象或数组 

绑定对象 

<template>
    <div :class="{ active: isActive,'text-danger': hasError }">isActive</div>
</template>
<script>
 export default {
    data(){
        return{
            isActive:true,
            hasError:true
       }
   }
}
</script>

多个对象绑定

<template>
    <div :class="classObject">isActive</div>
</template>
<script>
  export default {
    data() {
        return {
            classObject: {
                active: true,
                'text-danger': true
           }
       }
   }
}
</script>

绑定数组

<template>
    <div :class=" [activeClass,errorClass]">isActive</div>
</template>
<script>
 export default {
    data() {
        return {
            activeClass: 'active',
            errorClass: 'text-danger'
       }
   }
}
</script>

如果你也想在数组中有条件地渲染某个 class,你可以使用三元表达式:

<template>
    <div :class="[isActive ? 'active' : '']">isActive</div>
</template>
<script>
  export default {
    data() {
        return {
            isActive:true
       }
   }
}
</script>

 数组和对象

<template>
    <div :class="[{ 'active':isActive }, errorClass]"></div>
</template>
<script>
  export default {
    data() {
        return {
            isActive:true,
            errorClass:"text-danger"
       }
   }
}
</script>

温馨提示

数组和对象嵌套过程中,只能是数组嵌套对象,不能反其道而行

Style绑定 

数据绑定的一个常见需求场景是操纵元素的 CSS style列表,因为 style 是 attribute,我们可以和其他 attribute 一样使用 v-bind 将它们和动态的字符串绑定。但是,在处理比较复杂的绑定时,通过拼接生成字符串是麻烦且易出错的。因此,Vue 专门为 stylev-bind 用法提供了特殊的功能增强。除了字符串外,表达式的值也可以是对象或数组 

绑定对象 

<template>
    <div :style="{ color: activeColor, fontSize: fontSize + 'px' }">Style绑定</div>
</template>
<script>
  export default {
    data() {
        return {
            activeColor: 'red',
            fontSize: 30
       }
   }
}
</script>
<template>
    <div :style="styleObject">Style绑定</div>
</template>
<script>
  export default {
    data() {
        return {
            styleObject: {
                color: 'red',
                fontSize: '30px'
           }
       }
   }
}
</script>

绑定数组

我们还可以给 :style 绑定一个包含多个样式对象的数组

<template>
    <div :style="[baseStyles]">Style绑定
</div>
</template>
<script>
  export default {
    data() {
        return {
            baseStyles:{
                color:"green",
                fontSize:"30px"
           }
       }
   }
}
</script>

侦听器

我们可以使用 watch 选项在每次响应式属性发生变化时触发一个函数 

<template>
    <p>{{ message }}</p>
    <button @click="clickHandle">修改数据</button>
</template>
<script>
  export default {
    data() {
        return {
            message:"前端"
       }
   },
    methods:{
        clickHandle(){
            this.message = "Python"
       }
   },
    watch:{
        message(newValue,oldValue){
            console.log(newValue,oldValue);
       }
    }
}
</script>

 实时效果反馈

1. 下列那个是侦听器关键字:

A data

B methods

C computed

D watch

表单输入绑定 

在前端处理表单时,我们常常需要将表单输入框的内容同步给 JavaScript 中相应的变量。手动连接值绑定和更改事件监听器可能会很麻烦, v-model 指令帮我们简化了这一步骤 

<template>
    <input type="text" v-model="message">
    <p>{{ message }}</p>
</template>
<script>
  export default {
    data() {
        return {
            message:""
       }
   }
}
</script>

复选框

单一的复选框,绑定布尔类型值

<template>
    <input type="checkbox" id="checkbox" v-model="checked" />
    <label for="checkbox">{{ checked }}</label>
</template>
<script>
  export default {
    data() {
        return {
            checked:true
       }
   }
}
</script>

修饰符

v-model 也提供了修饰符: .lazy 、 .number 、 .trim

.lazy

默认情况下, v-model 会在每次 input 事件后更新数据。你可以添加 lazy 修饰符来改为在每次 change 事件后更新数据

<template>
    <input type="text" v-model.lazy="message">
    <p>{{ message }}</p>
</template>
<script>
  export default {
    data() {
        return {
            message:""
       }
   }
}
</script>

 实时效果反馈

1. 下列那个是表单输入惰性属性:

A .lazy

B .number

C .trim

D .type

模板引用 

虽然 Vue 的声明性渲染模型为你抽象了大部分对 DOM 的直接操作,但在某些情况下,我们仍然需要直接访问底层 DOM 元素。要实现这一点,我们可以使用特殊的 ref attribute

挂载结束后引用都会被暴露在 this.$refs 之上 

<template>
    <div ref="container">容器</div>
    <input type="text" ref="username">
    <button @click="getUserName">获取数据
</button>
</template>
<script>
  export default {
    methods:{
        getUserName(){
          console.log(this.$refs.container);
          console.log(this.$refs.username.value);
       }
   }
}
</script>

 实时效果反馈

1. 下列直接获取DOM,读取 ref 正确的方式是:

A this.ref

B this.refs

C this.$ref

D this.$refs

组件组成 

组件最大的优势就是可复用性

当使用构建步骤时,我们一般会将 Vue 组件定义在一个单独的 .vue 文件中,这被叫做单文件组件(简称 SFC) 

组件组成结构 

<template>
    <div>承载标签</div>
</template>
<script>
   export default {}
</script>
<style scoped>
</style>

组件引用

<template>
  <TemplateDemo />
</template>
<script>
  import TemplateDemo from "./components/TemplateDemo.vue"
  export default {
     components: {
        TemplateDemo
  }
}
</script>

实时效果反馈

1. 在Vue单文件组件中,样式中的 scoped 的作用是:

A 生效作用域,只在当前组件内生效

B 生效作用域,全局生效

C 引用组件,在引用组件中生效

D 单文件组件必须存在的结构

组件嵌套关系 

组件允许我们将 UI 划分为独立的、可重用的部分,并且可以对每个 部分进行单独的思考。在实际应用中,组件常常被组织成层层嵌套的树状结构

这和我们嵌套 HTML 元素的方式类似,Vue 实现了自己的组件模型,使我们可以在每个组件内封装自定义内容与逻辑 

创建组件及引用关系 

Header

<template>
    <h3>Header</h3>
</template>
<style scoped>
  h3{
    width: 100%;
    height: 100px;
    border: 5px solid #999;
    text-align: center;
    line-height: 100px;
    box-sizing: border-box;
}
</style>

Main

<template>
    <div class="main">
        <h3>Main</h3>
        <Article />
        <Article />
    </div>
</template>
<script>
  import Article from './Article.vue';
  export default {
    components: {
        Article
   }
}
</script>
<style scoped>
.main{
     float: left;
    width: 70%;
    height: 400px;
    border: 5px solid #999;
    box-sizing: border-box;
    border-top: 0px;
}
</style>

Aside

<template>
    <div class="aside">
        <h3>Aside</h3>
        <Item />
        <Item />
        <Item />
    </div>
</template>
<script>
import Item from "./Item.vue"
export default {
    components: {
        Item
   }
}
</script>
<style scoped>
.aside{
    float: right;
    width: 30%;
    height: 400px;
    border: 5px solid #999;
    box-sizing: border-box;
    border-left: 0;
    border-top: 0;
}
</style>

Article

<template>
    <h3>Article</h3>
</template>
<style scoped>
h3{
    width: 80%;
    margin: 0 auto;
    text-align: center;
    line-height: 100px;
    box-sizing: border-box;
    margin-top: 50px;
    background: #999;
}
</style>

Item

<template>
    <h3>Item</h3>
</template>
<style scoped>
h3{
    width: 80%;
    margin: 0 auto;
    text-align: center;
    line-height: 100px;
    box-sizing: border-box;
    margin-top: 10px;
    background: #999;
}
</style>

组件注册方式

一个 Vue 组件在使用前需要先被“注册”,这样 Vue 才能在渲染模板时找到其对应的实现。组件注册有两种方式:全局注册和局部注册 

全局注册 

import { createApp } from 'vue'
import App from './App.vue'
import GlobalComponent from "./components/GlobalComponent.vue"
const app = createApp(App);
app.component("GlobalComponent",GlobalComponent)
app.mount('#app');
<template>
    <h3>全局应用组件</h3>
</template>

局部注册

全局注册虽然很方便,但有以下几个问题:

 局部注册需要使用 components 选项

<template>
  <GlobalComponent />
</template>
<script>
 import GlobalComponent from "./components/GlobalComponent.vue"
 export default {
  components:{
    GlobalComponent
   }
}
</script>
<style>
*{
  margin: 0;
  padding: 0;
}
</style>

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

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

相关文章

一个小项目带你了解vue框架——TodoList(简单实用易上手)

写在前面 你是否还在为繁杂的事情感到头昏脑涨&#xff1f;你是否还在将便利贴贴满整个桌面&#xff1f;本文就为你解决这个烦恼&#xff0c;使用vue框架做一个TodoList&#xff0c;将事情整理的井井有条不再是一个遥不可及梦&#xff01;让我们行动起来吧&#xff01; 基于vue…

解决前端项目问题,uniapp运行微信开发工具小程序,出现× initialize报错,以及浏览器无法运行

项目场景&#xff1a; uniapp进行小程序以及多端web页面都不知道如何配置讲项目运行起来。 就会报出无法运行错误。 [微信小程序开发者工具] - initialize [微信小程序开发者工具] [微信小程序开发者工具] IDE may already started at port , trying to connect如图 问题描…

微信小程序前端解密获取手机号

微信小程序在获取用户手机号时安全正确的做法是把获取的iv等信息传递给后端&#xff0c;让后端解密&#xff0c;再提供接口返回给前端。 但是遇到一下比较一般的后端或者懒的后端的话&#xff0c;前端也可以考自己完成手机号解密。 1.使用授权手机号组件按钮 <view class&…

【Vue】Cannot set reactive property on undefined,null,or primitive value:undefined

一、背景描述技术栈&#xff1a;vue element报错内容&#xff1a;Cannot set reactive property on undefined, null, or primitive value:undefined如下图所示&#xff1a;二、报错原因根据报错内容翻译一下&#xff0c;就是不能对 undefined,null 或者原始值为 undefined 的…

uniapp中怎么使用easycom 自定义组件

一、全局注册 uni-app 支持配置全局组件&#xff0c;需在 main.js 里进行全局注册&#xff0c;注册后就可在所有页面里使用该组件。 Vue.component 的第一个参数必须是静态的字符串。nvue 页面暂不支持全局组件。 二、局部注册 局部注册之前&#xff0c;在需要引用该组件的…

详解Promise使用

Promise引入PromiseExecutorresolve不同值的区别then方法catch方法finally方法resolve类方法reject类方法all类方法allSettled方法race方法引入Promise 我们调用一个函数&#xff0c;这个函数中发送网络请求(我们可以用定时器来模拟)&#xff1b; 如果发送网络请求成功了&…

前端面试题 | 什么是回流和重绘?它们的区别是什么?

在了解回流和重绘之前我们可以先简单了解一下浏览器的渲染过程~ 1. 解析获取到的HTML&#xff0c;生成DOM树&#xff0c;解析CSS&#xff0c;生成CSSOM树 2. 将DOM树和CSSOM树进行结合&#xff0c;生成渲染树&#xff08;render tree&#xff09; 3.根据生成的渲染树&#xff0…

Vue开发环境安装

目录 Vue概述&#xff1a; Vue特点&#xff1a; Vue官网: 一、node.js安装和配置 1. 下载安装node.js Step1&#xff1a;下载安装包 Step2&#xff1a;安装程序 Step3&#xff1a;查看 问题解决&#xff1a; 解决npm warn config global --global, --local are depr…

Session详解

&#x1f451; 博主简介&#xff1a;    &#x1f947; Java领域新星创作者    &#x1f947; 阿里云开发者社区专家博主、星级博主、技术博主 &#x1f91d; 交流社区&#xff1a;BoBooY&#xff08;优质编程学习笔记社区&#xff09; 前言&#xff1a;上节我们详细讲解了…

华为云从入门到实战 | 云服务概述与华为云搭建Web应用

云计算在快速发展过程中逐渐形成了不同的服务模式(Service Model)。根据云计算最终服务的交付形态主要分为3种类型,软件即服务、平台即服务与基础架构即服务。从根源上来说,云计算的服务模式来源于面向服务的架构SOA(Service-Oriented Architecture)。所谓SOA,就是一种架构设…

npm install或npm i后没有依赖包node_modules?

今天git clone一个项目发现npm i后发现自己的文件下面没有node_modules包&#xff0c;但是有如图提示&#xff1a;但是文件夹下没有任何新增文件 added 1 package in 674ms 随后查看了C:\Users\俊\AppData\Roaming\npm\node_modules 图一&#xff1a; 里面存在今天执行npm i…

微信小程序实训|基于云数据库的语文听写工具

本实训项目结合云开发的云数据库和 “微信同声传译”插件&#xff0c;制作一个可真实运营的小学生语文听写工具&#xff0c;页面效果如图1所示。 ▍图1 “听写小助手”页面 基于云开发的微信小程序具有众多优势&#xff0c;云开发模式真正解放了开发者&#xff0c;使得开发效率…

Vue3全家桶入门 (通过vue-cli脚手架搭建todolist项目环境,深入vue3.0核心知识)

目录 一、todolist项目准备 vue3.0环境搭建&#x1f344; 二、todolist基本结构 1. 定义组件&#x1f437; 2.实现todolist需要用到的四个组件 &#x1f436; 3.ref定义单个数据 &#x1f42d; 4.reactive定义对象类型的数据&#x1f439; 5. 实现todolist每个组件需要…

前端实战【ES6】你会ES6,但是你真的会用吗?

目录&#x1f31f;前言&#x1f31f;关于取值&#x1f31f;关于合并数据&#x1f31f;关于拼接字符串&#x1f31f;关于if中判断条件&#x1f31f;关于列表搜索&#x1f31f;关于扁平化数组&#x1f31f;关于获取对象属性值&#x1f31f;关于添加对象属性&#x1f31f;关于输入…

vue父子组件传值:父传子、子传父

最近项目中又需要用到父子组件&#xff0c;用了很多次之后对父子组件终于有种从善如流的感觉。会了之后再看自己写的父子组件传值的文章&#xff0c;感觉还是存在很多问题的&#xff0c;问题就不改了&#xff0c;在这篇文章做个总结和纠正吧。 父子组件就是在一个vue文件中引入…

瑞吉外卖项目:编辑员工信息与公共字段自动填充

目录 一. 编辑员工信息 1.1 需求分析 1.2 代码编写 执行流程 后端代码 二. 项目公共字段填充 2.1 问题分析 2.2 代码实现 2.3 功能完善 一. 编辑员工信息 1.1 需求分析 在员工管理列表点击编辑按钮&#xff0c;跳转至编辑页面后&#xff0c;回显员工数据进行修改。 …

前端开发利器--PxCook(像素大厨)

前端开发利器 - - PxCook&#xff08;像素大厨&#xff09;1、PxCook简述2、PxCook安装3、PxCook基本操作3.1 通过软件打开设计图3.2 常用快捷键3.3 常用工具3.4 从psd文件中直接获取数据1、PxCook简述 前端开发软件&#xff1a; PS&#xff08;Photoshop&#xff09;收费、占…

【SVG】路径<Path>标签详解,一次搞懂所有命令参数

在上一篇文章 什么是SVG&#xff1f;——SVG快速入门 中我对SVG做了基础的介绍&#xff0c;这篇文章将集中讲解<path>标签 本站链接&#xff1a;什么是SVG&#xff1f;——SVG快速入门_gxyzlxf的博客-CSDN博客 稀土掘金链接&#xff1a;什么是SVG&#xff1f;——SVG快…

npm修改默认源(默认镜像)

1 npm修改默认源(默认镜像) 首先如果之前安装过node.js的需要先卸载&#xff0c;删除npm原始默认安装目录&#xff08;在cmd命令面板执行 npm config ls 查看npm默认路径&#xff09; 在cmd命令面板中输入npm config ls 查看npm默认路径 删除操作如下所示&#xff1a; 重新安…

js实现base64,url,blob之间的相互转换

一般来说前端展示图片会通过三种方式&#xff1a; url、base64、blob 1.url: 一般来说&#xff0c;图片的显示还是建议使用url的方式比较好。 let url "http://xxxxxx" 2.base64&#xff1a; 如果图片较大&#xff0c;图片的色彩层次比较丰富&#xff0c;则不适合…