vue3学习

Vue 3 学习难点解析 然而,Vue 3 也存在一些学习难点,如新的 Composition API、响应式系统的变化、类型推断和类型支持、组件开发和组合、状态管理和数据共享以及高级特性和工具等。通过系统学习和实践、深入理解原理和机制以及持续学习和更新等方法,可以克服这些学习难点,掌握 Vue 3 的知识和技能。Vue.js 是一款流行的前端 JavaScript 框架,Vue 3 在 Vue 2 的基础上进行了重大的更新和改进,带来了更高效的性能、更强大的功能和更灵活的开发体验。新的 Composition API。 阅读详情

this.$data.content=this.content

**生命周期:**creat mount update unmount

Vue.creatApp({
data(){},
template:``
}).mount(’#root’)
v-on:@
v-model:双向绑定
v-bind:属性绑定

app.component(‘todo’,{})
app.mount(’#root’)

**局部组件:**需要做映射,首字母大写,驼峰命名
const Count={}
const app=Vue.creaApp({
components:{conuter:Counter},
template:``
})
全局组件:app.component() 横线间隔

props:{
required:
default:
type:
validator(){}
}
属性传值传的时候,使用content-abc,接的时候,使用contentAbc

单项数据流,不能修改父组件传过的数据,但是可以使用

父组件往子组件传值的时候,子组件不用props接收:Non-props属性

**// **Non- -props属性****
const app = Vue. createApp({
template:`
 <div>
<counter msg="hello" msg1="hello1" />
</div>
`
});
app. component('counter', {
. // inheritAttrs: false,
mounted() {
console. log (this . $attrs.msg);
},
I
template:
<div :msg="$att rs. msg">Counter</div>
<div v-bind="$attrs">Counter</div>
<div :msg1=" $attrs. msg1">Counter</div>
}) ;

emit
props:[]
emits:[’’]
不通过emit方法:
父组件:
子组件:
props:[‘data’]
handleClick(){
this.$emit(‘update:data’,this.modelValue+3);
}

props:{
‘modelValue’:String,
‘modelModefiers’:{
default:()=>({})
}
},
handleClick(){
let newValue=this.modelValue+‘b’
if(this.modelModifiers.uppercase){
newValue=newValue.toUpperCase();
}
}

slot
具名插槽

<template v-slot:“header”>

header


<template v-slot:“footer”>
footer


app.component('layout,{
template:`



content


作用域插槽
属性传递

const app=Vue.createApp({
  template:`
    <list v-slot="{item}">
      <div>{{item}}</div>
    </list>
  `
});
app.component('list',{
  date(){
    return {list:[1,2,3]}
  },
  template:`
    <div>
      <slot v-for="item in list" :item="item"/>
    </div>
  `
})
const vm=app.mount('#root');

动态组件和异步组件
动态组件:
handleClick(){
if(this.currentItem ===‘input-item’){
this.current=‘common-item’;
}else{
this.currentItem=‘input-item’
}
父组件:

<button @click=“handleClick”>切换
再定义两个子组件

过渡动画

// 动画
@keyframes leftToRight{
  0%{
    transfrom:translateX(-100px);
  }
  50%{
    transform:translateX(-50px);
  }
  0%{
    transform:translateX(0px);
  }
}
.animation{
  animation :leftToRight 3s;

// 过度
transition{
  transition:3s background-color escape;
}
}
.blue{
  background:blue;
}
.green{
  background:green
}
data (){
  return{
    transition:true,
    blue:true,
    green:false,
  }
}
handleClick(){
  this.Animate.blue=!this.Animate.blue;
  this.animate.green=!this.animate.green;
}
// 单元素组件的入场和出场效果 多元素多组件也可以
动画效果网站:animate.style
@keyframes shake{
  0%{
    transfrom:translateX(-100px)
  }
  50%{
    transfrom:translateX(-50px)
  }
  100%{
    transform:translateX(50px)
  }
}
.bye{
  animation:shake 3s;
}
.hello{
  animation:shake 3s;
}
<div>
//:duration 时间 :css=false关闭动画 @before-enter @enter-active @after-enter @before-leave钩子 appear刚进入也有效果
  <transition enter-active-class="hello" leave-active-class="bye">
    <div v-if="show">hello world</div>
  </transition>
  <button @click="handleClick">切换</button>
</div>

列表动画
状态动画

mixin

// 组件的data,methods优先级比mixin优先级更高
// 生命周期函数,先执行mixin里面的
// 自定义属性,组件中的属性优先级高于mixin属性的优先级
const myMixins={
  data(){
    return{
      number:1
    }
  }
}

data(){}
mixins:[myMixins]

自定义指令

//第一种
<div v-pos="100" class="header">
  <input/>
</div>
app.directive('focus',(el,binding)=>{
  el.style.top=(binding.value+'px');
}
// {
//   mounted(el,banding){
//     el.style.top=(bainding.value+'px');
//   }
// }

)
//第二种
const app=vue.createApp({
  data(){
    return{
      distance:110
    }
  },
  template:`
    <div>
      <div v-pos:right="distance" class="header">
        <input/>
      </div>
    </div>
  `
})
app.directive('pos',(el,binding)=>{
  el.style[binding.arg]=(binding.value+'px')
})
const vm=app.mount('#root')
// 局部指令
const directives={
  focus:{
    mounted(el){
      el.focus();
    }
  }
}
const app=Vue.createApp({
  directives:directives,
  template:`
    <div>
      <input v-focus/>
    </div>
  `
})

teleport传送门

<div class="area">
<button @click='handleBtnClick'>按钮</button>
  <teleport to="#hello">
    <div class="mask" v-show="show">{{message}}</div>
  </teleport>
</div>

render函数
template -> render -> h ->虚拟DOM (JS对象) ->真实DOM ->展示到页面上
插件的定义和使用

const myPlugins={
  install(app,options){
    app.provide('name','Dell Lee');
    app.directive('focus',{
      mounted(el){
        el.focus();
      }
    })
    app.mixin({
      mounted(){
        console.log('mixins')
      }
    })
    app.config.globalProperties.$sayHello='hello world';
  }
}
const app=Vue.createApp({
  template:`<my-title/>`
});
app.component('my-title',{
  inject:['name'],
  mounted(){
    console.log(this.$sayHello);
  },
  template:`<div>{{name}}<input v-focus/></div>`
})
校验插件
const app=Vue.createApp({
  data(){},
  rules:{
    ages:{
      validate:age=>age>25,
      message:'too young'
    }
  }
})
const validatorPlugin=(app,options)=>{
  app.mixins({
    created(){
      for(let key in this.$options.rules){
        const item=this.$options.rules[key];
        this.$watch(key,(value)=>{
          const result=item.validate(value);
          if(!result) console.log(item.message);
        })
      }
    }
  })
}

conposition Api- setup函数

// Setup函数,在create实例被完全初始化之前,不能使用this,return的东西可以被模板使用
// 是composition的东西
setup(props,context){
  return {
    name:'dell',
    handleClick:()=>{
      alert(123)
    }
  }
}

ref,reactive,toRefs,readonly响应式

// ref,reative响应式
// proxy对数据封装ref('dell')->proxy({value:'dell'})
setup (props,context){
  // res
  // const {ref}=Vue;
  // let name=ref('dell');
  // setTimeout(()=>{
  //   name.value='lee'
  // },2000)
  // return {name}

    //reactive,readonly不可修改
  const {reactive,readonly}=Vue;
  const nameObj=reactive([123]);
  const copyNameObj=readonly(nameObj)
  setTimeout(()=>{
    nameObj[0]=456
    copyNameObj[0]=456 //是不被允许的
  },2000)
  return{nameObj}
}
// toRefs用于解构,解构后还是响应式:{name:'dell'}变成proxy({name:'dell'})
// toRefs proxy({name:'dell',age:21}),->{name:proxy({value:'dell}),age:proxy({value:21})}
const {reactive,toRefs} =Vue;
const Obj=reactive({name:'dell',age:21});
setTimeout(()=>{
  nameObj.name='lee'
},2000)
const {name,age}=toRefs(nameObj);
return{name}

setUp封装

// todolist封装
<script>
  {/* 关于list操作的内容封装 */}
  const listRelativeEffect=() => {
    const {reactive}=Vue;
    const list=reactive([]);
    const addItemToList=(item) => {
      list.push(item);
    }
    return {list,addItemToList}
  }
  {/* 关于inputValue操作的内容进型封装 */}
  const inputRelativeEffect = () =>{
    const {ref}=Vue;
    const inputValue=ref('');
    const handleValueChange=(e)=>{
      inputValue.value=e.target.value
    }
    return{inputValue,handleValueChange}
  }
  const app=Vue.createApp({
    setup (){
      // 流程调度中转
      const {list,addItemToList}=listRelativeEffect();
      const {inputValue,handleValueChange}=inputRelativeEffect();
      return{
        list,addItemToList,
        inputValue,hanleInputChange
      }
    },
    template:`
    <div>
      <div>
        <input :value="inputValue" @input="handleValueChange"/>
        <button @click="()=>addItemToList(inputValue)">提交</button>
      </div>
      <ul>
        <li v-for="(item,index) in list" :key="index">{{item}}</li>
      </ul>
    </div>
    `
  })

</script>

computed计算属性

const app=Vue.createApp({
  setup(){
    const {reactive,computed}=Vue;
    const countObj=reactive({count:0});
    const handleClick=()=>{
      countObj.count+=1;
    }
    let countAddFive=computed({
      get:()=>{
        return countObj.count+5;
      },
      set:(param)=>{
        countObj.count=param-5;
      }
    })
    setTimeout(()=>{
      countAddFive.value=100;
    },3000)
    return {count,countAddFive,handleClick}
  }
  template:`
    <div>
      <span @click="handleClick">{{count}}</span>--{{countAddFive}}
    </div>
  `
})

watch,watchEffect监听器

// watch具有惰性,能拿到原始和当前值,可以一个监听器承载多个数据的变化
// watchEffect是立即执行,会自动监测内部代码,不需要传进监听的内容,只要一个回调参数,没办法获取之前的值,根据数据依赖决定是否执行

setup (){
  const{reactive,watch,watchEffect,toRefs}=Vue;
  const nameObj=reactive({
    name:'dell',englishName:'lee'
  })
  watch([()=>nameObj.name,()=>nameObj.englishName],([curName,curEng],[prevName,preEng])=>{
    console.log(curName,precName,'---',curEng,preEng);
  },{
    immediate:true  //让监听器立即执行
  })
  // watchEffect(()=>{console.log(nameObj.name)});
  // 取消监听器
  const stop=watchEffect(()=>{
    console.log(nameObj.name);
    setTimeout(()=>{
      stop();
    },5000)
  })
  const {name,englishName}=toRefs(nameObj);
  return {name,englishName}
  
  template:`
  <div>
    <div>
      name:<input v-model="name"></input>
    </div>
  </div>
  `
}

生命周期

const app=Vue.createApp({
  // beforeMount =>onBeforeMount
  // mounted =>onMounted
  // beforeUpdate =>onBeforeUpdate
  // beforeUnmount=>onBeforeUnmount
  // unmount=>onUnmounted
  // onRenderTracked页面渲染触发,onRenderTrriger页面重新渲染触发
  setup(){
    const{
      ref,onBeforeMount,onMounted,onBeforeUpdate,unUpdates,onRenderTracked
    }=Vue;
    const name=ref('dell')
    onBeforeMount(()=>{
      console.log('onBeforeMounted')
    })
  }
})

provide,inject

const app=Vue.createApp({
  setup(){
    const {provide,ref,readonly} = Vue;
    const name=res('dell');
    provide('name',readonly(name)); //让接收的不能直接通过name.value修改值
    provide('changeName',(value)=>{
      name.value=value;
    })
  },
  template:`
    <div>
      <child/>
    </div>
  `
})
app.component('child',{
  setup(){
    const {inject}=Vue;
    const name=inject('name');
    const changeName=inject('changeName');
    const handleClick=()=>{
      changeName('lee');
    }
    return {name,handleClick}
  },
  template:'<dvi @click="hadleClick">{{name}}</dvi>'
})

ref获取DOM节点

// Composition API语法下,获取真实的DOM元素节点
const app=Vue.createApp({
  setup(){
    const {res, onMounted}=Vue;
    const hello=ref(null);
    onMounted(()=>{
      console.log(hello.value)
    })
    return {hello}
  },
  template:`
    <div>
      <div ref="hello">hello world</div>
    </div>
  `
})
const vm=app.mount('#root')

路由
异步加载:首次加载页面不会加载没展示的路由的页面,跳转的时候才会加载
component:()=>{}
vuex
通过this.store.state.name获取vuex定义的name通过this.store.state.name获取vuex定义的name 通过this.store.state.name获取vuex定义的name通过this.store.dispatch(‘change’)派发change的action ,执行change
action中的change --this.commit(‘change’) 提交一个commit 触发一个mutation,执行mutation
mutation写同步,action写异步
通过CompositionAPI使用Vuex

// 通过aompositionAPI使用VueX
export default {
  name:'Home',
  setup(){
    const store=useStore(); //关键
    const {name}=toRefs(store.state);
    const handleClick=()=>{
      store.dispatch('getData')
    }
    return {name,handleClick}
  }
}

杂记
为了让所有的浏览器显示同样的样式:nomalize (npm install normalize.css --save)(import ‘nomalize.css’)

Vue 3学习指南 按照此路径学习,结合项目实践和社区参与,你将逐步掌握Vue 3的核心技能,并能在实际开发中高效构建现代Web应用。 阅读详情

相关推荐

vue3 学习总结

<div>原始数据:{ { list }}</div><div>计算后的数据:{ { setList }}

m0_67307574的博客 1102

为什么Vue3中声明响应式一般用const

为什么Vue3中声明响应式对象一般用const。如因为 Vue 的响应式系统是通过属性访问进行追踪的(响应式数据对象的属性的副作用函数的订阅),因此我们必须始终保持对该响应式对象的相同引用。副作用订阅将被存储在一个全局的 WeakMap 数据结构中。

dbeidouxingf的博客 7498

VUE3学习路线

按照上述阶段进行学习,你将能够系统地掌握 Vue 3 开发的各个方面。根据自己的进度和兴趣调整学习内容,实践是最好的学习方法。此外,保持对新技术和最佳实践的关注,持续提升自己的开发能力。祝你学习愉快!

蜡笔小新星的博客 3367

vue3中响应式变量为什么可以声明为const

在 Vue 3 中,响应式变量通常是通过ref和reactive函数创建的,并且它们常常被声明为const。这种做法初看似乎有些矛盾,因为const在 JavaScript 中用于声明一个不可重新赋值的常量。然而,这里的关键在于理解 JavaScript 中的引用和 Vue 的响应式系统如何工作。

于坤 1890

SQL Server2008详细安装步骤(超详细步骤)

https://pan.baidu.com/s/1yvolqfU-AbiuGrIzblA7pA 提取码:lzw81.下载好安装包后解压到除C盘以外的磁盘,避免系统卡顿2.使用管理员身份打开安装程序注意:使用管理员身份打开时,此时如果显示以下画面属于正常现象,下载安装即可。因为.net现在有很多软件都需要,包括SQLSERVER2008,它里面有visual studio都要有net,电脑系统没有的话安装一下好了。3.选择全新安装或向现有安装添加新功能4.点击确定5.出现以下画面之后,输入产品密钥即可(密钥在

m0_67402774的博客 4万+

REST-meta-MDD Data总结

sMRI数据使用:nwc1、nwc2、nwc3(同样数据集相关论坛中有相关信息指向需要使用wc1、wc2、wc3)多方咨询与讨论后决定使用nwc数据,这里说明wc数据相对wc数据要大的多如wc1的大小为1.33GB,而nwc1的数据却有6.90GB。VBM文件:/REST-meta-MDD/Sharing/REST-meta-MDD-VBM- phase1 -Sharing.tar.gz。1、Excel中的表型信息:1-男,2-女;-9999或空白表示缺少数据。

2404_88295660的博客 1532

Vue3基础知识-1

setup函数的参数,主要有两个:props和context。

weixin_43484007的博客 2122

台达PLC DIAdesigner-AX 编程实战:从安装到通信配置

本文详细介绍了台达PLC DIAdesigner-AX编程的实战操作,从软件安装、项目创建到通信配置的全流程。重点讲解了TCP/IP通信设置、库文件管理及常见错误处理,帮助工程师快速掌握台达PLC编程技巧,提升工业自动化项目的开发效率。

weixin_29215391的博客 530

VUE3入门笔记

特性:声明为一个常量,不能被修改,不可以再次赋值,它的指向是不可以改变的,只能指向某处固定区域,不能再指向其它地方。provide可以向所有子孙组件提供数据以及提供修改数据的方法,子孙组件用inject使用数据。① 声明后必须初始化赋值,如:const name=‘aaa’,不可以 const name;② 常量的含义是指向的对象不能修改,但是可以修改对象中的属性。ref 定义简单的变量,reactive一般定义数组和对象。实际上是在给对象userName的属性重新赋值。都是用作定义基本变量的。

qq_39004843的博客 1217

86 arduino 电机yl_(八)arduino入门:直流电机控制

一、本节介绍在本实验中,您将学习如何使用驱动芯片L293D和SunFounder Uno板控制小型直流(DC)电机的方向和速度。为了使初学者更容易,我们将让直流电机左右旋转,自动加速和减速。二、材料准备1 *小型直流电机1 * L293D1 * Arduino Uno板1 *面包板1 * USB数据线杜邦线三、原理讲解L293D这是一个非常实用的芯片,可以独立控制两台直流电机。在这个实验中,只有一...

weixin_29163857的博客 3567

iverilog+GTKwave使用总结

iverilog是一个开源的硬件描述语言(HDL)仿真工具,用于对硬件描述语言(如Verilog)编写的数字电路进行仿真。它可以将Verilog代码编译为仿真模型,并通过仿真运行来验证设计的正确性。iverilog支持IEEE 1364-2005 Verilog语言标准,并提供了丰富的功能,包括对多种Verilog语言特性的支持、模块化设计、测试平台等。它还可以与其他工具(如GTKWave波形查看器)配合使用,以便进行仿真后的波形查看和分析。

争取早日成为硅农 2万+

为什么vue3项目中推荐使用const,而不是let语法

const 声明的变量是只读的,这意味着它们的值不能被重新赋值。这有助于防止在组件的整个生命周期内不小心修改状态,从而使得状态管理更加安全。:使用 const 声明的对象或数组是单例的,这意味着它们在声明时只被初始化一次,之后不会被重新创建。这有助于确保组件状态的一致性,特别是在使用响应式系统时。:Vue 3 使用了 Composition API,其中的 reactive、ref 和 reactiveRef 等函数创建了响应式变量。

qq_35876316的博客 1982

STM32开发 -- 4G模块开发详解(1)

这部分一直再看,资料都已经整理好了,但是一直没有汇总。接下来就详细的看一下,GSM这部分是怎么实现的。

不积跬步,无以至千里 5万+

Vue3/VueJS技术学习笔记

Vue3/VueJS技术学习笔记 1、第一个Vue.js应用程序 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>hello-vue</title> <!--导入Vue.js,开发环境版本,包含了有帮助的命令行警告--> <script src="https://cdn.jsdelivr.net/npm/

microvulome的博客 1399

AMBA-CHI协议详解(十五)

Write transactions事务描述以及请求属性,cache line状态转换。

Crazzy_M的博客 650

PointNet++改进策略目录

后续我将如何使用文章中创新点加入的PointNet++中代码实现部分进行更新。

u012901740的博客 2195

Vue3 非常好用的中文文档以及一份 Vue 3 新文档学习笔记

焕然一新的 Vue3 中文文档来了! 新文档地址:https://vuejs.org 中文版翻译:https://staging-cn.vuejs.org(官方已标注为新版) 旧版中文版:https://github.com/vuejs/docs/graphs/contributors (官方已标注为旧版) 学记笔记与脑图在原文连接中 原文链接:https://mp.weixin.qq.com/s/xajtqF0eaesrtZmifq4BuQ ...

qq_29454203的博客 1133

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

vuejs学习5.3 vue-router

vue-router动态路由路由懒加载vue-router打包文件解析路由懒加载的使用嵌套路由router-link传递参数配置动态路由——params使用querybutton传递参数使用query使用params 动态路由 在设置路由映射关系时:后面使用:添加拼接内容 { path:'/user/:userId', component:User } 在使用时:动态获取userId的内容,使用v-bind,然后进行字符串拼接 <router-link v-bind:

qq_39225271的博客 492

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

重生之我在学Vue-- Vue3 学习路径总览

一个完整的项目应该包含前端和后端,一名合格的程序媛也不应该掌握前端或者后端,更应该两者兼修,方能行稳致远。以下为20天Vue3学习计划,从基础到进阶比较全面的学习计划:Vue3 官方中文文档传送点:简介 | Vue.jsVue3 的中文官方文档学习笔记很全还有练习场,推荐去官网学习Go后端学习之路_野生的程序媛的博客-优快云博客学习目标:复习前 9 天的内容,总结学习成果。学习内容巩固基础知识,解决项目中的问题。总结 Vue 3 开发的核心流程。任务完善项目的功能与样式。

Xiao651的博客 2884

VUE3学习

安装 Vue.js 主要有两种方法,取决于你是想使用 Vue.js 的 CDN 还是想通过 npm 进行项目开发。

qq_40595376的博客 1151

【Vuejs】908- Vue 3.0 进阶之深入学习响应式 Refs API

本文是 Vue 3.0 进阶系列 的第九篇文章,在组合式 API setup 配置项中经常会见到 Refs API 的身影,比如 ref、toRef 或 toRefs 等。那么这些常用 A...

pingan8787 977

对于Vue3的学习!

记录本人对于Vue3的学习!不定时补充!学习地址 :Vue.js。

晚风乱了温柔的博客 1620

vuejs学习3.4 webpack基本使用——配置Vue

配置Vue下载使用vue真实代码el和template区别代码抽取抽取一抽取二抽取三安装vue-loader vue-template-compiler配置 下载 下载特定版本 npm install vue@2.6.11 --save 使用vue //后面必须是小写的vue import Vue from "vue" const app = new Vue({ el:"#app", data:{ message:"我是message", }, }) <div id="ap

qq_39225271的博客 811

Vue3 学习计划安排

【代码】Vue3 学习计划安排。

爱尚丽明的博客 1353

Vue3 学习笔记

hook。

liqinjv的博客 1375

vue3学习文档

学习vue3地址:https://24kcs.github.io/vue3_study/

weixin_53035812的博客 1424
上一篇: Chrome调试
下一篇: React
qq_47414739
博客等级 码龄7年 0粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值