学习vue

setup

监听数据

import { watch , watchEffect ,computed ,ref,reactive} from 'vue' //ref设置响应式的基本数据类型 reactive 设置响应式的引用数据类型
// watchEffect 立即执行传入的一个函数,同时响应式追踪其依赖,并在其依赖变更时重新运行该函数。
let WatchStopHandle= watchEffect(()=>{ 逻辑代码 })
// watchEffect 返回一个WatchStopHandle函数用来停止监听
// WatchStopHandle()取消监听
    // 清除副作用
    // 在一些情况下,我们需要在监听函数中执行ajax请求,但是在网络请求还没有到达服务的时候,需要停止监听或者监听函数被再次执行
    // 在这种情况下,五年应该把上次网络请求去停止掉,这个时候就可以清除上一次的副作用
    // 在watchEffect 传入的回调函数中,有一个默认参数(方法) onInvlidate(回调函数)
    let stopWatch = watchEffect((onInvalidate) => {
      console.log("name==>", name.value);
      console.log("age==>", age.value);
      // setTimeout==>模拟ajax请求  
      let timer = setTimeout(() => {
        console.log("发送后端的数据,2秒后执行");
      }, 2000);
      onInvalidate(() => {
        clearTimeout(timer);
      });
    });	
//  watch 监听使用 reactive 声明的响应式数据变化 有三个参数 第一个需要 ()=>监听的数据,第二个回调函数,第三个对象配置是否深度监听,是否初始化执行    immediate:true,//初始化执行
    // {flush:'pre'|'post'|'sync'}
    // pre 默认参数 它会在元素挂载或者更新 前 去执行Effect回调函数
    // post 它会在元素挂载或者更新 后 去执行Effect回调函数
    // sync 强制效果始终同步触发 ==> 然而 这是抵消的 应该减少使用
//computed 计算属性作为一个方式使用具有返回值 computed()

使用 $router

import { useRouter , useRoute } from ' vue-router ' ; 
let router=useRouter()  //这是**router**就相当于原来的this.$router

使用vuex
import { useStore } from ‘vuex’
使用ref获取dom
let refs=ref(null) ; 给对应的dom 写上 ref=‘refs’ 就可以通过refs.value获取dom元素了
setup中使用nextTick
首先 import { nextTick } from ‘vue’; 例子如下;
使用nextTick

  async function fn() {
      await nextTick(); 
      ipt.value.focus();
    }

setup语法糖 在script中写个一个setup

那些书写格式,retun都可以省略掉,只需import导入使用即可,下面是组件传值

import { defineProps ,defineEmits , defineExpose , useAttrs , useSlots } from 'vue'
defineProps({  // 接受父组件传递过来的数据
    ky: String
})
const emit=defineEmits(['cks']) // 调用父组件定义好的自定义方法
// 	emit("cks",'传值') 调用
defineExpose({
	// 需要暴露的数据,和方法
})

withDefaults 帮助ts定义defineProps传递数据的类型
vue3样式支持使用v-bind了

body{
	font-size:v-bind(size)
}

getCurrentInstance 支持访问内部组件实例 。并挂载属性

import { getCurrentInstance } from "vue";
let internalInstance = getCurrentInstance().appContext.config.globalProperties;
//获取createApp身上的属性

router-link

在vue3.0中< router-link / >中的tag属性被移出,不能修改< router-link >的默
认标签,但是vue3.0中给我们提供了 custom 配置 ,不通过tag属性修改,直接嵌套
< router-link > 中,又会出现一个问题,原标签的 to 属性失效,vue提供 v-slot 插槽 暴露底层的制定能力 navigate 是解析后的规范地址 放在我们的v-slot中
最后配合 @click=“navigate” 实现了页面跳转
exact active class 给当前页面路由对应的< router-link/ > 跳转的地址精准一直就添加一个calss类名,这个属性在vue3.0被废弃,但是 v-slot 中暴露的 isExactActive 为true填

    <router-link custom v-slot="{navigate,isExactActive}" v-for="item,i in tabs" :key="i" :to="item.url">
        <div @click="navigate" :class="{active:isExactActive}">
          <span>{{item.name}}</span>
        </div>

在vue3.0中 $router.psuh(’’) 不会出现重复跳转当前路由报错的问题,那就意味我们可以不使用标签了
vue3组件守卫中的第三个参数next没有了跳转页面的作用,vue3中改成了return 来实现跳转

transtion

在vue3中transtion 中的 从哪里离开和从哪里结束 的类名改变成了 from从哪开始 to 到哪里去
当我们用transtion包裹< router-view / > 是写法也发送了改变 需要使用 v-slot 暴露 Componten
并使用这个标签 并采用动态组件的行书书写 用 transtion 组件包裹

   <router-view v-slot="{ Component }">  // class类名 
      <transition>
        <component :is="Component" />
      </transition>
    </router-view>

当然了也可以直接用直接包裹要加动画的组件,div,路由,直接包裹路由如果有出现警告就要上边的方式包裹,如果还有警告,路由页面的组件内容还行vue2中哪有只放一个根节点。
vue3.0中要严格按照顺序去写

keep-alive
    <router-view v-slot="{ Component }">// 必须为最外曾
      <transition>
        <keep-alive>
          <component :is="Component" />
        </keep-alive>
      </transition>
    </router-view>

mitt一个类似于$bus的第三方插件

1下载 npm i mitt -S
`import mitt from ‘mitt’; const mits=mitt(); export default mits; //使用时导入用法和以前一样 import mits from ‘./mitt’;

实现 v-model

vue3混合
父组件 在子组件上 v-model=‘arr’
setup()中又两个参数,第一个接收props,第二个参数cnt中又atters如果props没有接收数据,就放在atters中
还有一个emit用于调用父组件的方法,类似于 vue2中的this. e m i t ( ) ; 我 们 可 以 通 过 c n t . e m i t ( ′ u p d a t e : m o d e l V a l u e ′ , ′ 传 参 ′ ) 这 样 就 修 改 了 父 组 件 中 的 值 我 们 还 可 以 用 v − m o d e : 自 定 义 = “ 父 组 件 的 数 据 ” 子 组 件 中 也 可 以 直 接 使 用 c n t . e m i t ( ′ u p d a t e : 自 定 义 ′ . ′ 传 参 ′ ) ∗ ∗ v u e 2 ∗ ∗ v − m o d e 其 实 是 一 个 : v a l u e = " v a l u e ; @ i n p u t = " i n p u t " 这 个 事 件 也 可 以 是 c h a n g e 的 集 合 子 组 件 调 用 t h i s , emit(); 我们可以 通过 cnt.emit('update:modelValue','传参') 这样就修改了父组件中的值 我们还可以用 v-mode:自定义=“父组件的数据” 子组件中也可以直接使用 cnt.emit('update:自定义'.'传参') **vue2** v-mode其实是一个 :value="value; @input="input" 这个事件也可以是change 的集合 子组件调用 this, emit();cnt.emit(update:modelValue,)vmode:=使cnt.emit(update:.)vue2vmode:value="value;@input="input"changethis,emit(‘input’,‘参数’) 就完成了对父组件数据的修改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值