vue3基础常用语法

前言:vue2 是option API; vue3是composition API。所以在语法上有很大不同,以下为上手vue3的常用语法。

一、vue3里 script 的三种写法

1.1 最基础 —— vue2的写法
<template>
	<div>{{ num }}</div>
	<button @click="onClick"> +1 </button>
</template>
<script>
export default {
	data() {
		return {
			num : 1,
		};
	},
	methods: {
		onClick() {
			this.num += 1;
		},
	},
}
</script>

总结: 和vue2完全一样,简单明了。无上手难度

1.2 新语法 —— setup() 属性
<template>
	<div>{{ num }}</div>
	<button @click="onClick"> + 1 </button>
</template>
<script>
	import { ref } from 'vue';
	export default {
		// 注意这部分
		setup() {
			let num = ref(1);
			const onClick = () => {
				num.value += 1;
			};
			return {
				num,
				onClick,
			};
		},
	}
</script>

总结: 所有的对象和方法都需要 return 才能在template中使用,写法繁琐,不推荐

1.3 推荐 —— <script setup>
<template>
	<div>{{ num }}</div>
	<button @click="onClick"> + 1 </button>
</template>
<script setup>
	import { ref } from 'vue';
	const num = ref(1);
	const onClick = () => {
		num.value += 1;
	};
</script>

总结: 推荐使用第三种写法,简单明了,定义的变量或方法也无需return才可使用。但需要注意一点以前在 data 中创建的属性,现在全都用 ref() 或者 reactive() 声明;在 template 中直接用,在 script 中记得加 .value

二、vue3 中的响应式数据

2.1 ref => 推荐,项目中基本已经够用

针对单个变量,将其变成响应式的数据

import { ref } from 'vue';
// todo...
setup(){
	const name = ref('张三')  // 不使用ref,name将不是响应式数据  
    return {
    	name // 在其他地方改变了name后,页面将同步更改;但在 script 中使用记得加 `.value`
    }
}
2.2 reactive

创建响应式数据,返回的是一个对象state。注意,如果直接使用 state.属性名 的方式导出一个属性并且使用到页面中,那么这个属性将不是响应式(state这个对象才是响应式

import { reactive } from 'vue';
// todo...
setup(){
	const state = reactive({name: '张三'})    
    return {
        // 此时,state是一个对象并且是响应式的,但是里面的name属性却不是响应式的 ==>> 页面中使用:{{state.name}}
        state
        
      // 如果在页面中想简单一些直接使用 {{name}},可以这样导出:
        name: state.name  // 但是,请注意。这样导出的数据在导出时就绑定了值,并不是响应式的数据
    }
}
2.3 toRefs

针对对象,类似解构,解构出来的每一个属性都是响应式的,保证数据是响应式的

// 用法
import { toRefs } from 'vue';
// todo...
setup(){
	const state = {
		name: '张三',
		age: 18
	};
    return {
        ...toRefs(state)	// 这样里面的每一条属性都是响应式的
    }
}

三、props 和 emits

definePropsdefineEmits 都是只能在 <script setup> 中使用的编译器宏。它们不需要导入,且会随着 <script setup> 的处理过程一同被编译掉。

3.1 props 属性

声明 props 需要使用用 defineProps()

// Vue3 的写法
<template>
	<div>{{ foo }}</div>
</template>
<script setup>
// 注意这里
// defineProps 可在<script setup>直接使用,无需要引入
const props = defineProps({
	foo: String
})
// 在 script 标签里使用
console.log(props.foo)


// --------------- 注意:不能结构,会失去响应式效果 -------------
const { foo } = props; // 不要这么写
console.log(foo)
</script>
3.2 emits 事件

与 props 相同,声明 emits 我们可以用 defineEmits()

<template>
	<div @click="onClick">
		这是一个div
	</div>
</template>
<script setup>
	// 注意这里
	const emit = defineEmits(['add1', 'decre1']);
	const onClick = () => {
		emit('add1', '参数1', '参数2', '...参数n') // 注意这里
		emit('decre1', '参数1', '参数2', '...参数n')
	}
</script>

四、computed

<template>
	<div>
		<span>{{ str }}</span>
		<span>{{ reversedValue }}</span>
	</div>
</template>
<script setup>
	import {ref, computed} from 'vue'
	const str = ref('It is a string')
	// 注意这里
	const reversedValue = computed(() => {
		// 使用 ref 需要 .value
		return str.value.split('').reverse().join('');
	})
</script>

五、watch

vue3 中,watch 有两种写法。一种是直接使用 watch,还有一种是使用 watchEffect

  • watch 需要你明确指定依赖的变量,才能做到监听效果;即指定监听哪个变量
  • watchEffect 会根据你使用的变量,自动的实现监听效果;类似computed,根据使用的变量实现监听
5.1 使用watch => 更好理解,个人推荐
<template>
	<div>{{ count }}</div>
	<div>{{ addCount }}</div>
	<button @click="onClick"> 增加 1 </button>
</template>
<script setup>
	import { ref, watch } from 'vue';
	const count = ref(1);
	const onClick = () => {
		count.value += 1;
	};
	const addCount = ref(0);

	// 注意: 需要明确指定依赖的是 count 这个变量
	watch(count, (newValue) => {
		addCount.value = newValue + 1;
	})
</script>
5.2 使用 watchEffect

// Vue3 的写法
<template>
	<div>{{ count }}</div>
	<div>{{ addCount }}</div>
	<button @click="onClick"> 增加 1 </button>
</template>
<script setup>
	import { ref, watchEffect } from 'vue';
	const count = ref(1);
	const onClick = () => {
		count.value += 1;
	};
	const addCount = ref(0);
	
	// 注意这里
	watchEffect(() => {
		// 会自动根据 count.value 的变化,
		// 触发下面的操作
		addCount.value = count.value + 1;
	})
</script>

六、methods

// Vue3 的写法
<template>
	<div @click="onClick">
	这是一个div
	</div>
</template>
<script setup>
	// script setup 直接定义即可;但如果是写在setup(){} 里面需要return
	const onClick = () => {
		// ... todo
		console.log('clicked')
	}
</script>

八、生命周期

Vue3 里,除了将两个 destroy 相关的钩子,改成了 unmount;剩下需要注意的,就是在 <script setup> 中,不能使用 beforeCreatecreated 两个钩子。
使用方法:在 setup 里,用 on 开头,加上大写首字母就行

<template>
	<div></div>
</template>
<script setup>
	import {
		onBeforeMount,
		onMounted,
		onBeforeUpdate,
		onUpdated,
		onBeforeUnmount,
		onUnmounted,
	} from 'vue'
	onBeforeMount(() => {})
	onMounted(() => {})
	onBeforeUpdate(() => {})
	onUpdated(() => {})
	onBeforeUnmount(() => {})
	onUnmounted(() => {})
</script>

九、store和router

vue3 里面因为没有this,所以在页面中route、store、data的使用都和vue2.x都有所区别

  • 拿到当前页面的 store 和 route
import { useRoute } from "vue-router";
import { useStore } from "vuex";
export default {
	setup(props, context){	// setup 默认只执行一次
        const route = useRoute();	// 全是函数式API,调用即可
        const store = useStore();
        
      	// 然后就可以快乐的使用route和store了
    }
}
  • setup : 入口,介绍两个参数;props:参数,context:上下文对象(里面包括attr,slots,emit,props等属性和方法)


文章仅为本人学习过程的一个记录,仅供参考,如有问题,欢迎指出!
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vue常用方法总结 第一章 Vue核心知识讲解 5 第二节 引包、留坑、实例化 、插值表达式{{}} 5 1. 引包 5 2. 留坑 5 3. 实例化 5 4. 插值表达式{{ }} 5 第三节 熟悉及使用常用指令 5 1. 什么是指令 5 2. 常用的指令有哪些,及怎么使用这些指令 6 第四节 阐述vue单双向数据流及事件绑定 6 1. vue单向数据流绑定属性值 v-bind: (属性) 简写 :(属性) 6 2. vue双向数据流 v-model 只作用于有value属性的元素 7 3. 事件绑定v-on:事件名="表达式||函数名" 简写 @事件名="表达式||函数名" 8 4. 总结 8 第五节 过滤器 8 1、过滤器有全局过滤器和组件内的过滤器 应用 {{ msg | 过滤器名}} 8 2、 vue中的this是vue封装好给我们使用的,跟平常方法里面的this是不同的 9 第六节 数据监听watch(深度监听)计算属性computed 9 watch监听单个,computed监听多个 9 总结: 10 第二章 组件化开发知识介绍 11 第一节 组件化开发 11 1、 创建组件的两种方式 11 局部声明 11 2、组件类型(组件开发三步曲:声明、注册、使用 ) 11 第二节 slot插槽和ref、$parent (重点) 11 1、slot插槽 11 2、ref获取子组件实例 12 第三节 父子组件的通信 (核心) 13 1、父传子 14 2、子传父 14 第四节 非父子组件之间的通信 14 简介:建立Bus总线机制实施非父子组件通讯 14 3、回调函数写法 16 第五节 vue的生命周期 17 1、需要频繁的创建和销毁组件 17 2、组件缓存 17 3、成对比较 17 第三章 Vue核心插件之路由模块 18 第一节 路由的跳转原理(哈希模式) 18 1、单页应用的路由模式有两种(哈希模式、history模式) 19 2、 哈希模式原理 19 3、建议的选择:(小D课堂课程) 19 第二节 安装和使用路由 19 第三节 路由的跳转 20 1、路由的跳转方式2种: 20 2、区别: 20 3、vue-router中的对象:$route $router 21 第四节 路由的传参和取参 21 1. 查询参 21 2. 路由参数 21 3、js跳转路由传参和标签传参,路由相同而参数不同时页面不做刷新的问题 22 总结: 22 第五节 嵌套路由(Children) 23 第六节 路由守卫 23 第五章 Vue全家桶各部分核⼼知识详解 24 第1节 构建vue项⽬的利器—脚⼿架vue-cli3 24 1、安装vue-cli3 24 2、创建项⽬ 24 3、 vue.config.js ⼿动在根⽬录新建⼀个vue.config.js⽂件 24 第2节 ⽗⼦组件传值(参考第二章第2、3节) 25 第3节 非⽗⼦组件传值(参考第二章第4节) 25 1. 事件总线(参考第二章第4节) 25 2. $attrs / $listeners 25 3. Vuex (详见第5节) 25 第4节 玩转单⻚⾯应⽤的控制中⼼—vue-router(与第三章基本差不多) 26 梦学谷第137课ElementUI实现页面横向指示导航,比小D课堂的那种写法要好点 26 1、路由的基本配置 26 2、路由的跳转 26 3、动态路由 27 4、嵌套路由 27 5、导航守卫 27 6、路由懒加载 28 第5节 状态管理中⼼—vuex的基础⽤法(官方文档,非常好用) 28  State 28  Mutations 28  Actions 28  vuex⾥包含的基本参数 28  还有别的mapState这些很好用 29 import { mapState, mapMutations } from "vuex";(导入非默认成员) 29 其实是ES6语法,详见梦学谷89课 29 第6节 状态管理中⼼—vuex的⾼级⽤法 29  vuex中的计算属性—Getters 30  模块化概念—Modules 30
Vue3中的:class指令用于动态地绑定CSS类。在Vue3中,有三种方式来使用:class指令。 第一种是直接绑定一个字符串,这个字符串可以是一个类名,也可以是多个类名组成的字符串,用空格隔开。例如,可以这样写:<div class="text" :class="'active text-bg'">第一种class绑定字符串形式</div>,这样就会给这个元素添加active和text-bg这两个类。 第二种是使用对象的形式来绑定class。可以通过在对象中设置键值对的方式来决定是否添加某个类名。例如:<div class="text" :class="{active: isActive, 'text-bg': !isActive}">第二种class绑定对象形式</div>,这样根据isActive的值来决定是否添加active类,如果isActive为真,则添加active类,否则添加text-bg类。 第三种是使用数组的形式来绑定class。可以将多个类名放在一个数组中。例如:<p :class="[message, activeClass]">hello</p>,这样就会将message和activeClass这两个变量的值作为类名添加到元素上。 需要注意的是,数组语法在开发中并不常用,因为它不太方便控制class。而使用对象的形式能更灵活地根据条件来动态绑定类名。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [VUE3 class 用法](https://blog.csdn.net/weixin_46730573/article/details/125832119)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Vue3基础+代码语法+例子大全(三)——Class与Style绑定](https://blog.csdn.net/m0_46610349/article/details/126641434)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值