vue3.0基础知识浅谈

首先创建vue3.0 项目

方法一: 命令行工具 (CLI)

查看@vue/cli版本 确保在4.5.0 以上 vue – version 或者 vue –v
下载@vue/cli  npm install –g @vue/cli
npm create 项目名

方法二:Vite

npm版本 6.x
npm init vite@latest <project-name> --template vue
npm版本 7+,需要加上额外的双短横线
npm init vite@latest <project-name> -- --template vue
cd <project-name>
npm install
npm run dev

若要创建vue3+Ts项目 则将上述template vue换成template vue-ts

相比于vue2的变化

1.模板中可以没有根标签

2.main.js中变化

vue2引入的是vue的构造函数
vue3引入名为createApp的工厂函数
vue3中实例对象app比vue2中vm‘轻’没有vm身上那么多的属性和方法

// vue2引入的是vue的构造函数
// import Vue from "vue";
// vue3引入名为createApp的工厂函数
import { createApp } from 'vue'

import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'

import App from './App.vue'

// 创建应用实例对象app 
//(类似vue2中的vm,但app比vm‘轻’没有vm身上那么多的属性和方法)
const app = createApp(App)

app.use(ElementPlus)
app.mount('#app')

组合API

一、setup

1.作用

  1. setup是vue3.0中新的配置项 值为函数,是 Composition API(组合API)的入口
  2. vue3.0中新的配置项,值为函数,组件中所用到的数据和方法…配置在setup中
  3. 在setup函数中定义的变量和方法最后都是需要 return 出去的 不然无法再模板中使用

2.返回值

  • 第一种若返回一个对象,则对象中的属性,方法,在模板中均可以直接使用
  • 第二种若返回一个渲染函数可以自定义渲染内容(例如 return ()=>h(‘h1’,’你好’))

3.注意点

1、setup在beforeCreate 和 created 之前执行,this是undefind
2、由于在执行 setup函数的时候,还没有执行 Created 生命周期方法,所以在 setup 函数中,无法使用 data 和 methods 的变量和方法
3、由于我们不能在 setup函数中使用 data 和 methods,所以 Vue 为了避免我们错误的使用,直接将 setup函数中的this修改成了 undefined
4、setup函数只能是同步的不能是异步的
5、vue2配置的(data、methods、computed…)中可以访问到setup中的属性和方法
6、setup中不能访问到vue2配置的(data、methods、computed…)
7、如果有重名 setup优先
8、setup不能是一个async函数,因为返回值不再是return 对象,而是promise,模板看不到return

4.参数

setup有两个参数
参数1:props 值为对象,包含组件外部传递过来且组件内部声明接收了的属性(大白话就是:父传子通过props,子组件必须写props进行接收,这样setup的第一个参数才能使用)
参数2:上下文是一个普通 JavaScript 对象,暴露了其它可能在 setup 中有用的值

  • Context.attrs:值为对象,包含外部传递过来,但没有在props配置中声明的属性
  • Context.slots:收到的插槽内容 插槽用法如下:
父组件中:
<Childll>
  <template v-slot:vSlot8>
    <span>插槽练习</span>
  </template>
</Childll>
子组件中
<template>
<slot name="vSlot8"></slot>
</template>
  • Context.emit:分发自定义事件的函数,相当于vue2.X中的this.$emit

子组件:

<template>
  <div>
    <button @click="clickBtn" class="btn-item">hi~</button>
  </div>
</template>
<script>
export default {
  setup (props, context) {
    const clickBtn = () => {
      context.emit("on-change", "hi~");
    };
    return { clickBtn}
  }
</script>

父组件:

<template>
  <div>
    <Child @on-change="emitFn" />
  </div>
</template>

<script>
import Child from "./Child.vue"
export default {
  components: {
    EmitChild
  },
  setup () {
    const emitFn = v => {
      console.log(v);
    }
    return { emitFn }
  }
}
</script>

二、Ref函数

作用:定义响应式的数据
用法:

  1. 先引入ref import { ref } from ‘vue’;
  2. 定义数据: let username = ref(‘张三’) let job = ref({ type: ‘男’,age: 18})
  3. Js中操作定义的数据 username.value job.value.type
  4. 模板中读取数据 {{ username }} {{ job.type }}

三、reactive函数

作用:定义一个对象类型的响应式数据
用法:

  1. 先引入reactive import { reactive} from ‘vue’;
  2. 定义数据: let num= reactive ([1,2,3,4,5]) let job = ref({children: {type:‘男’,age: 18}})
  3. Js中操作定义的数据 num[0] job. children.type

四、Ref和Reactive的区别

  1. 定义数据:
    Ref用来定义基本数据类型、Reactive定义对象\数组类型数据
  2. 原理:
    Ref通过vue2中的Object.defineProperty()的get与set来实现响应式数据劫持
    Reactive通过使用Proxy来实现响应式
  3. 使用
    Ref定义数据后js中操作数据需要.value获取,模板读取不需要.value
    Reactive定义数据后 操作和读取均不需要.value

五、生命周期

写法一、跟vue2.X写法一样,区别在于(beforeUnmount、unmount)名称不一样
写法二、写在setup里面的生命周期,通过组合API的形式
使用均需要引入
如: import { onBeforeMount } from ‘vue’
Setup(){ onBeforeMount( () =>{} ) }
具体对比:

Vue2.XVue3.0
beforeCreate不需要(也可以理解为setup)
created不需要(也可以理解为setup)
beforeMountonBeforeMount
mountedonMounted
beforeUpdateonBeforeUpdate
updatedonUpdated
beforeDestroyonBeforeUnmount
destroyedonUnmount
activatedonActivated
deactivatedonDeactivated

六、Hook

Hook:是一个函数、把setup函数中的组合api进行了封装,类似于vue2中的mixin,
Src目录下新建hooks文件夹 里面写各种逻辑的hook
例如:新建usePoint.js

// 引入文件所需
import { reactive, onMounted, onBeforeUnmount } from 'vue'
export default function(){
  let point = reactive({
    x:0,
    y:0
  }), 
  function savepoint(event){
    point.x = event.pageX
    point.y = event.pageY
  }
  onMounted(() => {
    window.addEventListener('click',savepoint)
  })
  onBeforeUnmount(()=>{
    window.removeEventListener('click',savepoint)
  })
  return point
}

其他vue文件需要用到此hook时

import  usepoint  from  '路径'
// 然后在setup 中直接调用赋值
setup () {
	let point = usepoint()
	return {point}
}

七、toRef和torefs

有这么一个痛点
例:
定义一个英雄的对象,渲染时在模板中使用会重复数次写Hero.

<template>
  <p>姓名:{{Hero.name}}</p>
  <p>年龄:{{Hero.age}}</p>
  <p>技能:{{Hero.job.j1.speak}}</p>
</template>
<script>
import { reactive} from "vue";
export default {
setup() {
    let Hero = reactive({
      name: '李四',
      age: 18,
      job: {
        j1: {
          speak: '你好'
        }
      }
    })
    return {
      Hero
    }
  }
}
</script>

解决上述痛点:

toRef

作用:创建一个ref对象,或者可以说将一个不是ref的变为ref
用法: 1. 引入
import { toRef } from “vue”;
在这里插入图片描述
这样模板中就是可以直接使用{{name}}

toRefs

toRef一次只能处理一个属性而toRefs可以处理多个

import { toRefs } from "vue";
 setup() {
return {
     ...toRefs(Hero)
    }
}

这样就解决一开始的痛点在模板中多次书写Hero.

八、toRaw

  1. 将一个由reactive生成的响应式对象转为普通对象(ref生成的不行)
  2. 操作场景 用于读取响应式数据,后续操作不会引起页面数据变化
  3. 用法: toRaw(需要转换的对象的)

九、markRaw

  1. 标记一个对象永远不作为响应式对象
  2. 用法 markRaw(需要标记的对象)

十、customRef

创建一个自定义的ref,并对其依赖项跟踪和更新触发进行显式控制,customRef里面需要写一个函数,函数接收两个参数,并且应该返回一个带有 get 和 set 的对象
track () 在get中通知vue追踪return出去的数据变化
tigger() 在set中改完数据后 通知vue重新解析模板

<template>
  <input v-model="keyword" />
  <h3>{{keyword}}</h3>
</template>

<script>
import { customRef } from "vue";
export default {
  name: 'Testvue',
  setup() {
    function myref(value,time = 1000) {
      let timer;
      return customRef((track, tigger) => {
        return {
          get() {
            track() // 通知vue追踪value的变化
            return value
          },
          set(newValue) {
            clearTimeout(timer)
            timer = setTimeout(() =>{
              value = newValue
              tigger() // 改完数据后 通知vue重新解析模板
            }, time)
          }
        }
      })
    }
    let keyword = myref('hello', 500)
    return {
      keyword
    }
  }
};

十一、provide和inject(祖孙组件之间通信)

父组件用provide提供数据 后代组件用inject使用数据
例 父组件:

import { reactive, provide} from "vue";

  setup() {
    let person = reactive({
      firstName: '张',
      lastName: '三'
    })
    provide('passData', person)
  }

后代组件:

import {inject} from "vue";
  setup() {
   let obj = inject('passData')
    return {
      obj
    }
  }

十二、Computed 计算属性

有简写和完整写法之分,完整写法考虑读写

   // 计算属性 简写 -- 单纯的读取
    person.fullName = computed(() => {
      return person.firstName + person.lastName
    })

    // 计算属性完整写法 --- 考虑修改
    person.fullName = computed({
      get() {
        return person.firstName + person.lastName
      },
      set(value) {
        const nameArr = value.split('-')
        person.firstName = nameArr[0]
        person.lastName = nameArr[1]
      }
    })

十三、watchEffect

不用指明监听那个属性的变化,回调函数中用到哪个属性,就监听那个属性变化

    watchEffect(() => {
      console.log(person.firstName);
    })

十四、watch监听

1、监听ref所定义的一个响应式数据

参数:

  1. 监听谁
  2. 回调函数
  3. 配置对象
<template>
  <h3>当前数值:{{ sum }}</h3>
  <button @click="sum++">增加</button>
</template>
<script>
import { ref, watch } from "@vue/runtime-core";
export default {
  setup() {
    let sum = ref(0);
    watch(
      sum,
      (newValue, oldValue) => {
        console.log(newValue, oldValue);
      },
      {
        immediate: true, // 立即监听
        deep: true, // 深度监听
      }
    );
    return {
      sum,
    };
  },
};
</script>

2、监听ref所定义的多个响应式数据

当监听多个响应式数据时,将多个数据放在一个数组里面,这样监听的newValue和oldValue都也都是也数组的形式呈现

<template>
  <h3>当前数值:{{ sum }}</h3>
  <button @click="sum++">增加</button>
  <h3>标题:{{ title }}</h3>
  <button @click="title+='~'">增加</button>
</template>
<script>
import { ref, watch } from "@vue/runtime-core";
export default {
  setup() {
    let sum = ref(0);
let title = ref("hi~");
// 监听多个
watch(
      [sum,title],
      (newValue, oldValue) => {
        console.log(newValue, oldValue);
      },
      {
        immediate: true, // 立即监听
        deep: true, // 深度监听
      }
    )
    return {
      sum,
      title,
    };
  },
};
</script>

3、监听reactive所定义的响应式数据的全部属性,

无法正确获取oldValue,并且强制开启了深度监听。

4、监听reactive所定义的响应式数据的某个属性

第一个参数要以回调函数返回写法

<template>
  <h3>姓名:{{Hero.username}}</h3>
  <h3>年龄:{{Hero.age}}</h3>
  <button @click="Hero.age++">改变年龄</button>
  <button @click="Hero.username += '~'">改变姓名</button>
</template>
<script>
import { reactive, watch } from "@vue/runtime-core";
export default {
  setup() {
    let Hero = reactive({
      username: '李四',
      age: 18,
      job: {
        j1: {
          speak: '你好'
        }
      }
    })
    // reactive所定义的响应式数据的某个属性
    watch(
      ()=>Hero.age, // 以回调形式拿到监听的属性
      (newValue, oldValue) => {
        console.log(newValue, oldValue);
      },
      {
        immediate: true, // 立即监听
        deep: true, // 深度监听
      })
    return {
     Hero
    };
  },
};
</script>

5、监听reactive所定义的响应式数据的多个属性

如果监听的属性嵌套层次比较深 则需要开启深度监听

watch(
      [()=>Hero.username, ()=>Hero.age, () =>Hero.job], // 以回调形式拿到监听的属性
      (newValue, oldValue) => {
        console.log(newValue, oldValue);
      },
      {
        immediate: true, // 立即监听
        deep: true, // 深度监听
    })

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Vue3.0是一款前端框架,相比于2.x版本,3.0版本提供了更好的性能和更好的类型支持。那么,如何从零入门Vue3.0呢? 首先,需要了解一些基础概念,例如Vue实例、组件、指令和计算属性等。可以通过阅读Vue官方文档或者相关书籍进行学习。另外,熟练掌握HTML、CSS以及JavaScript等基础知识也很重要。 接着,可以通过搭建一个简单的开发环境来完成Vue3.0的入门。可以搜索相关的教程或者跟着官方文档进行安装步骤,然后创建一个Vue实例,引入一些组件和指令,最后将它们渲染到页面上。 当了解了Vue3.0的基本用法后,可以通过阅读文档和实际操作来进一步提高自己的技能水平。一些高级的特性,例如Composition API、Teleport和Suspense等,可以帮助我们更加高效地开发应用程序。 最后,通过练习和写一些小项目来巩固学习成果,例如创建一个简单的To-Do-List应用或者一个博客系统等,这样可以更好地掌握Vue3.0的相关知识和技巧。 综上所述,Vue3.0的零基础入门需要掌握一些基础知识、搭建开发环境、了解基本用法、学习高级特性和练习实践等步骤,通过不断地探索和实践,可以更加深入地了解并掌握Vue3.0的技术。 ### 回答2: Vue 3.0 是一个开源的 JavaScript 框架,用于构建现代化的 Web 应用和单页面应用。如果您是一个零基础的入门者,现在学习 Vue 3.0 并不会太难,以下是一些入门技巧: 第一步,需要了解 Vue 3.0 的基础概念和语法。Vue 入门者需要了解 Vue CLI、Vue 组件、Vue 模板、指令、插件等基础概念。同时,需要使用 web 开发技术,如 HTML、CSS 等,并能够熟练使用 JavaScript。 第二步,您可以通过阅读官方文档或参加在线教学平台来进行学习。对于初学者,Vue 3.0 官方文档提供了基础特性、组件、Api、路由、状态管理、插件等信息。此外,优质的教学网站也是一个好的选择。 第三步,您可以开始进行实践项目。这些项目可以是基于 Vue 3.0 的 ToDo 应用程序、新闻客户端、简单的博客等。这些应用可以将概念与实践相结合,以加深您对 Vue 3.0 的理解。 第四步,加入开发社区并与开发者互动交流。开源社区比较活跃,您可以参与到其中,通过问答、发表评论、提出问题等方式得到帮助和学习经验。 最后,Vue 3.0 由于其易于学习和使用而受到了开发者的喜爱。只要您学习基础知识和实践经验,并成为 Vue 3.0 开发社区中的一员,那么在未来的开发实践中,您将会收获很多成果。 ### 回答3: Vue.js是一款简单易用、高效灵活的JavaScript框架。它被广泛应用于前端开发,不仅可以用于构建单页应用和复杂的Web应用程序,还可以用于构建管理面板、后台系统等。 Vue.js 3.0是Vue.js框架的最新版本,它带来了一些令人兴奋的新特性,包括更少的内存消耗、更快的运行速度和更好的类型推断。下面是一些零基础入门Vue.js 3.0的步骤: 1.准备环境 在开始使用Vue.js 3.0之前,您需要在计算机上安装Node.js和npm。然后,您可以使用npm安装Vue.js 3.0的CLI。 2.创建Vue.js应用程序 使用Vue.js CLI创建一个新的Vue.js应用程序。使用以下命令: vue create my-project 这条命令将创建一个新的Vue.js项目。 3.学习Vue.js基础知识 Vue.js是一种基于组件的框架,它允许您将复杂的应用程序拆分成多个小部件。了解Vue.js的基础知识非常重要,包括模板、组件、数据绑定和事件处理程序等。 4.编写组件 编写组件是Vue.js应用程序开发的核心。您可以使用Vue.js的组件系统来创建可重用的组件,并将它们组合成一个完成的应用程序。 5.使用Vue.js的路由器 Vue.js的路由器系统可以帮助您管理应用程序中的不同视图和组件之间的导航。学习使用Vue.js的路由器非常重要。 总之,Vue.js是一款易于学习和使用的前端开发框架。通过学习Vue.js的基础知识、编写组件、使用路由器和其他相关技术,您可以轻松地创建可重用的Vue.js应用程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值