当前位置: 首页 > news >正文

基于vue3速学angular

因为工作原因,需要接手新的项目,新的项目是angular框架的,自学下和vue3的区别,写篇博客记录下:
参考:https://zhuanlan.zhihu.com/p/546843290?utm_id=0

1.结构上:

vue3:一个vue文件,包括了html ts css
angular:至少需要三个文件,分别写html ts css文件写法如下:XXXXX.component.html

在这里插入图片描述
代码核心部分是ts文件里面的@Component,这里的功能是抛出了当前这个组件的调用名称 并且导入了html 和 css文件

@Component({// 组件标签名称 调用名称selector: 'xxxx-target',// 模板页面路径templateUrl: './xxxx-target.component.html',// 样式文件路径styleUrls: ['./xxxx-target.component.less']
})

2.html写法上,可以看到angular写法里面有很多括号[] (),那具体是干什么用的呢

vue写法

<button v-if="isShow" class="test-button" @click="onClick" :title="buttonTitle">{{ '1111' }}</button>
<input v-else type="text" v-model="name" />
<div v-for="(item,index) in cardList"></div>
<div v-show="isShow"></div>
<div :class="{ 'disabled': disabled, 'un-hover': true}" :style="{ color: color }"></div>
<div>    <slot></slot>  <slot name="icon"></slot> </div>

angular写法

<button *ngIf="isShow" class="test-button" (click)="onClick()" [title]="buttonTitle">{{ '1111' }}</button>
<input #elseTemplate type="text" [(ngModel)]="name" />
<div *ngFor="let item of cardList;let i = index"></div>
<div [hidden]="isShow"></div>
<div [ngClass]="{ 'disabled': disabled, 'un-hover': true}" [ngStyle]="{ color: color }"></div>
<div>    <ng-content></ng-content>  <ng-content select="[icon]"></ng-content> </div>

可以很轻松的看出差异
@click=>(click) 注意,vue里面可以隐藏函数的括号,angular必须加
:title=>[title]
v-model=>[(ngModel)]
v-if=>*ngIf
v-else=>#elseTemplate
v-for=>*ngFor 注意,angular的index需要let i = index写,然后下面用i来当index用
v-show=>[hidden]
:class=>[ngClass]
:style=>[ngStyle]
slot=>ng-content 注意,angular的插槽用的是select=“[xxx]”

插槽使用方式区别

<div-xxx><template #icon><div class="tips"></div></template></div-xxx>
差别就是angular不需要套一层template,如果是icon插槽增加一个icon属性即可
<div-xxx><div icon><div class="tips"></div></div></div-xxx>

3.ts写法上:
先来几个最常用的,子和父如何通讯的
angular:

在Angular组件之间共享数据,有以下几种方式:
1. 父组件至子组件: 通过 @Input 共享数据
2. 子组件至父组件: 通过 @Output EventEmitter 共享数据
3. 子组件至父组件: 通过 本地变量共享数据
4. 子组件至父组件: 通过 @ViewChild 共享数据
5. 不相关组件: 通过 service 共享数据,
缓存、广播等

下面用代码看下和vue3的区别

vue3写法

子组件:
<template><button  @click="onClick" loading="loading" {{ $t('refresh') }}</button>
</template>
<script lang="ts" setup>
const emit = defineEmits(['on-click']);
const props = defineProps({loading: { type: Boolean, default: true },
});const onClick = () => {emit('on-click');
};
</script>
父组件:
<template><button-XXXX  @onClick="onRefresh" :loading="xxxLoading"/>
</template>
<script lang="ts" setup>
const xxxLoading= ref(false);
const onRefresh= async() => {xxxLoading.value=true;// 执行函数await XXX();xxxLoading.value=false;
};
</script>

angular写法:

子组件:
@Component({selector: 'xxx-button',template: `<button (click)="onClick(true)">{{buttonName}}</button>`,
})
export class xxxComponent implements OnInit{@Output() vote = new EventEmitter<any>();@Input() buttonName: any;constructor() {}ngOnInit(): void {}onClick(isAdd:boolean): void {this.vote.emit(isAdd);}
}
父组件:
@Component({selector: 'xxx-div',template: `<xxx-button [buttonName]="buttonName" (vote)="onVote($event)"></xxx-button>`,
})
export class xxxComponent {buttonName="按钮名称";constructor() {}onVote(isAdd:boolean): void {if(isAdd){//具体操作}}
}

那么vue里面的父通过ref访问子组件,在angular要怎么实现呢,如下,只需要在父组件ts代码里面写@ViewChildren(‘xxx’) xxx ,然后在html子组件里面加上#xxx就行

@Component({selector: 'xxx-div',template: `<xxx-button #test1 [buttonName]="buttonName" (vote)="onVote($event)"></xxx-button>`,
})
export class xxxComponent {@ViewChildren('test1') test1;buttonName="按钮名称";constructor() {}onVote(isAdd:boolean): void {if(isAdd){//具体操作console.log('test1',test1)}}
}

监听事件:
vue3里面有watch watcheffet,我研究了下angular的,好像只有类似watcheffet的监听方法
需要监听的参数写在ngOnChanges里面的changes.XXX 当这个值变化的时候会触发

vue3写法

watch(() => props.isOpen,(value) => {console.log(value)},{ deep: true, immediate: true }
);watchEffect(() => {visible.value = props.show;
});

angular写法

  @Input() xxxDeatail;ngOnChanges(changes: SimpleChanges): void {// xxxDeatail 属性值变更时if (changes.xxxDeatail) {this.initDeatail();}}initDeatail(){}

计算属性
angular好像没有这玩意,只有个@pipe管道的东西,相当于写一个公共方法,用用挺麻烦,比如计算时间展示,或者复杂数据,重复操作的时候可以用到,感兴趣可以搜下

下面是个简单demo 主要看下用法,很多代码都省略了

import { Pipe, PipeTransform } from '@angular/core';@Pipe({name: 'boolToString',
})
export class BoolToStringPipe implements PipeTransform {transform(value: boolean, trueValue: string, falseValue: string): unknown {return value ? trueValue : falseValue;}
}

用的时候:

import { BoolToStringPipe } from 'boolToString.pipe';@Component({providers: [BoolToStringPipe ],
})
export class PatchUpgradeComponent implements OnInit {constructor(private boolToStringPipe : BoolToStringPipe ) {}getData(){this.boolToStringPipe.transform(true,'111','222');}
}

4.生命周期上
angular:

ngOnChanges:当 Angular 设置或重新设置数据绑定的输入属性时响应。时间上位于OnInit之前。初始化和值发生变化时调用。
ngOnInit:用于初始化页面内容,只执行一次。时间上位于OnChanges之后。
ngDoCheck:每次变更检测时执行,并会在发生Angular自己本身不能捕获的变化时作出反应。紧跟在ngOnChanges 和 ngOnInit钩子之后执行。慎用。
ngAfterContentInit:当 Angular 把外部内容投影进组件视图或指令所在的视图之后调用。第一次 ngDoCheck 之后调用,只调用一次。
ngAfterContentChecked:每当 Angular 检查完被投影到组件或指令中的内容之后调用。ngAfterContentInit和每次 ngDoCheck之后调用。
ngAfterViewInit:当 Angular 初始化完组件视图及其子视图或包含该指令的视图之后调用。第一次 ngAfterContentChecked之后调用,只调用一次。
afterViewChecked:每当 Angular 做完组件视图和子视图或包含该指令的视图的变更检测之后调用。ngAfterViewInit和每次 ngAfterContentChecked 之后调用。
ngOnDestroy:每当 Angular 每次销毁指令/组件之前调用。

5.实际开发中遇到的和vue的不同
自定义组件库不能如下写

<xxx-div />

必须这么写

<xxx-div></xxx-div>

ngif等等里面不能放函数 find findIndex等等,如下会报错,includes可以用

<div *ngIf="data.find(v=>v.id==='123')"></div>

写vue3的时候,进入界面的函数操作都是放在 onMounted 里面的,
写angular的时候,需要都放在 ngAfterViewInit() 里面才行,不能放在 ngOnInit() 里面,因为这个时候dom还没加载,读取dom的操作会报错

相关文章:

基于vue3速学angular

因为工作原因&#xff0c;需要接手新的项目&#xff0c;新的项目是angular框架的&#xff0c;自学下和vue3的区别&#xff0c;写篇博客记录下&#xff1a; 参考&#xff1a;https://zhuanlan.zhihu.com/p/546843290?utm_id0 1.结构上&#xff1a; vue3:一个vue文件&#xff…...

链游中的代币(Token)或加密货币(Cryptocurrency)是如何产生和使用的?

在区块链游戏&#xff08;链游&#xff09;中&#xff0c;代币和加密货币不仅是游戏经济的核心&#xff0c;也是连接现实世界与虚拟游戏世界的桥梁。这些数字货币不仅赋予了游戏内资产的真实价值&#xff0c;还为玩家提供了全新的互动和交易方式。下面&#xff0c;我们将深入探…...

2024年5月23日 (周四) 叶子游戏新闻

《Unclogged》Steam页面上线 马桶主题恐怖逃脱解谜Brody制作并发行&#xff0c;一款奇葩创意马桶主题恐怖逃脱解谜新游《Unclogged》Steam页面上线&#xff0c;本作暂不支持中文。 Meta人工智能主管杨立昆 大语言模型不会达到人类智能水平IT之家今日&#xff08;5月23日&#x…...

猫毛过敏终结者!宠物空气净化器让你告别红眼和喷嚏

猫毛过敏是一种常见的过敏性疾病&#xff0c;影响着全球数百万人的日常生活。这种过敏反应通常是由于对猫皮屑、唾液或尿液中的蛋白质产生免疫反应而引起的。症状可能包括打喷嚏、流鼻涕、眼睛痒、皮肤疹和呼吸困难&#xff0c;严重影响患者的舒适度和生活质量。对于猫毛过敏者…...

xgboost项目实战-保险赔偿额预测与信用卡评分预测001

目录 算法代码 原理 算法流程 xgb.train中的参数介绍 params min_child_weight gamma 技巧 算法代码 代码获取方式&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1QV7nMC5ds5wSh-M9kuiwew?pwdx48l 提取码&#xff1a;x48l 特征直方图统计&#xff1a; fig, …...

子网划分,交换机原理与配置

子网划分 IP地址 IPv4由32位二进制数组成&#xff0c;一般用点分十进制来表示 IPv4是由32位二进制数组成&#xff0c;分成四组,第组八位。例如:11000000.10101000.00000000.00000010 为了便于配置通常表示成点分十进制形式例如:192.168.0.2 255.255.255.0 IPv6由128位组成&…...

记mapboxGL实现鼠标经过高亮时的一个问题

概述 mapboxGL实现鼠标经过高亮可通过注册图层的mousemove和moveout事件来实现&#xff0c;在mousemove事件中可以拿到当前经过的要素&#xff0c;但是当使用该要素时&#xff0c;发现在某个地图级别下会有线和面数据展示不全的情况。究其原因&#xff0c;发现是mapboxGL在绘图…...

AI重塑了我的工作流

阅读内容 Inhai: Agentic Workflow&#xff1a;AI 重塑了我的工作流 4 种主要的 Agentic Workflow 设计模式 Reflection&#xff08;反思&#xff09;&#xff1a;让 Agent 审视和修正自己生成的输出。 举例&#xff1a;如果有两个 Agent&#xff1a;一个负责 Coding&#…...

vue使用Less报错semi-colon expectedcss(css-semicolonexpected)的解决方法

1、将 styleint 依赖项添加到项目中 npm install --save-dev stylelint stylelint-config-standard2、在根目录中添加stylelint.config.js文件&#xff08;与package.json同级&#xff09; module.exports {extends: ["stylelint-config-standard"],rules: {"…...

如何使用golang自带工具对代码进行覆盖率测试

在 Go 语言中&#xff0c;测试代码覆盖率通常使用 go test 命令结合 -cover 和 -coverprofile 1. 基本代码覆盖率报告 在项目目录下运行以下命令 go test -cover这将在控制台输出一个代码覆盖率的百分比。但是&#xff0c;这种方式不会保存覆盖率数据&#xff08;可以指定目…...

Android studio版本和Android gradle plugin版本对应表

1.Android studio 版本的升级&#xff0c;一个方面上看主要是升级对AGP最高版本的支持 2.那为什么AGP要出高版本呢&#xff0c;主要支持高版本的API&#xff0c;真是一环扣一环...

JavaRedis-主从集群-分片-数据结构-回收处理-缓存问题

一、主从集群 1.主从集群 主从集群读写分离&#xff0c;主能读能写&#xff0c;从只能读&#xff0c;读的数据是同步主的 docker搭建&#xff1a; docker-compose 这里设置网络模式为model&#xff0c;就直接暴露在了宿主机中&#xff0c;就不用映射端口了 不改就是默认的桥…...

Java原生JDBC概览

Java原生JDBC概览 一、是什么&#xff1f; JDBC是Java DataBase Connectivity的缩写&#xff0c;它是Java程序访问数据库的标准接口。 Java代码并不是直接通过TCP连接去访问数据库&#xff0c;而是通过JDBC接口来访问&#xff0c;而JDBC接口则通过JDBC驱动来实现对数据库的访…...

C# 跨线程访问UI组件,serialPort1串口接收数据

在Windows应用程序&#xff08;例如WinForms或WPF&#xff09;中&#xff0c;UI组件&#xff08;如按钮、文本框等&#xff09;都在主线程&#xff08;也称为UI线程&#xff09;上运行。当你在一个非UI线程&#xff08;例如&#xff0c;一个后台线程或者网络请求线程&#xff0…...

D - New Friends(AtCoder Beginner Contest 350)

题目链接: D - New Friends (atcoder.jp) 题目大意: 题目解析: 题目的大致意思: 假如A和B是朋友 B和C也是朋友 那么当A和C不是朋友的时候 可以通过B让A和C也成为朋友 问你增加了多少对的朋友关系 题目分析: 咱们可以从图论去考虑 当这一群是一个连通块 那么这一群点(人) 都…...

【FAQ】HarmonyOS SDK 闭源开放能力 —Account Kit(2)

1.问题描述&#xff1a; 怎么判断登录的华为帐号有变动&#xff1f; 解决方案&#xff1a; 华为帐号登录成功后会返回唯一标识OpenID和UnionID&#xff0c;如果切换不同的华为帐号登录&#xff0c;这个唯一标识会变。 OpenID是华为帐号用户在不同类型的产品的身份ID&#x…...

Web组态可视化编辑器 快速绘制组态图

演示地址&#xff1a;by组态[web组态插件] 随着工业智能制造的发展&#xff0c;工业企业对设备可视化、远程运维的需求日趋强烈&#xff0c;传统的单机版组态软件已经不能满足越来越复杂的控制需求&#xff0c;那么实现Web组态可视化界面成为了主要的技术路径。 行业痛点 对于…...

怎样在网上赚点零花钱?推荐十个正规的赚钱兼职平台

今天要和大家探讨一个激动人心的话题——网络赚钱。在这个互联网日新月异的时代&#xff0c;网络赚钱已经变成了触手可及的现实。如果你正打算在网上赚取一些额外收入&#xff0c;那么这篇文章绝对值得一读&#xff01; 在这个信息泛滥的时代&#xff0c;网络赚钱的机遇随处可…...

手动操作很麻烦?试试这个自动加好友神器吧!

你是不是也觉得手动逐一输入号码或是微信号&#xff0c;再搜索添加很麻烦&#xff1f;试试这个自动加好友神器——个微管理系统&#xff0c;帮助你省去繁琐的手工操作&#xff0c;节省时间和精力。 首先&#xff0c;在系统上登录微信号&#xff0c;无论你有多少个微信号&#…...

金额转大写

金额转大写 /*** 金额转大写* param n* returns {string}*/ export const moneyUppercase (n) > {let fraction [角, 分];let digit [零, 壹, 贰, 叁, 肆,伍, 陆, 柒, 捌, 玖];let unit [[圆, 万, 亿],[, 拾, 佰, 仟]];let head n < 0 ? 欠 : ;n Math.abs(n);let…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...