vue3的技术使用(部分)

注:本文章主旨对于新入门的伙伴,在vue2的基础上对vue3的使用有一定的理解和使用。

介绍:

在vue3中,不需要根标签div 如图:

<template>
  <div @click="fn1">我是子组件</div>
  <span>{{ "这是父组件的数据" }}</span>
 /* <span>{{ mystr }}</span>
  <span>{{ myid }}</span>
  <span>{{ str }}</span>*/
</template>

<script>
import { onMounted } from "vue";
export default {
  props: ["mystr", "myid", "str"],
  setup(props,  next ) {
    let str1 = null;
    console.log(props, 111);
 
    let fn1 = () => {
      console.log(next);
      next.emit("fn",8888);
    };
    onMounted(h=>{
       next.emit("fn",'执行 next.emit("fn",8888);');
    })
    return {
      fn1,
    };
  },
};
</script>

<style></style>

好了下面是如何创建项目:

项目的安装和启动

1、安装 vite

npm install -g create-vite-app

2、vite创建vue3项目 (建议使用,运行块)

npm init vite-app 项目名

3、安装依赖项目运行

-进入项目

cd 项目名

-安装依赖

npm i 
//或
npm install

 -运行项目

npm run dev

vue3路由的安装

npm安装

npm install vue-router@4

//文件的配置
//创建router文件夹 index.js
import { createRouter, createWebHistory } from 'vue-router'
import HomeView from '../views/Home.vue'

const routes = [
  {
    path: '/',
    name: 'home',
    component: HomeView
  },
  {//建议使用懒加载
    path: '/about',
    name: 'about',
    component: () => import('../views/About.vue')
  }
]

const router = createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes
})

export default router
//app.vue设置 router-view  路由出口

//main.js 全局使用路由
import router from './router'
//使用 use 路由
createApp(App).use(router).mount('#app')

vue3 xueX状态仓库的安装

npm install vuex@next --save

创建一个store文件夹 modules开启子模块  index.js主文件

//index.js
import { createStore } from 'vuex'

//引入分包
import noe from "./modules/noe";
export default createStore({
  // state: {
  // },
  // getters: {
  // },
  // mutations: {
  // },
  // actions: {
  // },
  modules: {//使用子模块
    noe
  }
})

//modules文件夹 noe.js子仓库
export default {
    //开启命名
    namespaced: true,
    state: {
        goodsList: [],
        twodata: 'two模块数据',
        name: "zhangsan"
    },
    mutations: {
        changeGoodsList(state, data) {
            state.goodsList = data
            console.log('执行了changeGoodsList');
        },
        changeTwo(state, data) {
            state.twodata = '修改之后的值'
            console.log('changeTwo');
        }
    },
    actions: {
        // actions的方法第一形参代表上下文对象
        getGoodsList(context) {
            console.log();
            // 需要将获取的商品赋值给goodsList
            // 调用mutations的方法
            context.commit('changeGoodsList', [1, 2, 3, 4, 5])
            console.log('getGoodsList');
        }
    },
    getters: {
        total(state) {
            return state.goodsList.length
        },
        total1(state) {
            return state.name + 333
        }
    }
}


//main.js
import store from './store'
//使用store
createApp(App).use(store).use(router).mount('#app')

其他的需求 插件就不在列了。需要可以去官网找找

生命周期

关于setup()内使用生命周期的改变
import{onBeforeMount}from'vue'
 beforeMount() ---onBeforeMount(()=>{console.log('onBeforeMount')})
  mounted() ---onMounted()
  beforeUpdate() ---onBeforeUpdate()
  updated() ---onUpdated()
  beforeUnmount() ---onBeforeUnmount()
  unmouted() ---onUnmouted()

自定义hook

//类似于mixin方法,复用代码,组合api。

创建一个hooks文件夹,创建usePoint.js
export default function () {
    import{onBeforeMount,onBeforeUnmount,reactive}from'vue'
    let point = reactive({
        x: 0,
        y: 0
    })
    //实现鼠标“打点”相关的方法
    function savePotint(event) {
        point.x = event.pageX;
        point.Y = event.pageY;
        console.log(event.pageX, event.pageY);
    }
    //挂载完成
    onMounted(() => {
        window.addEventListener('click',savePotint)
    })
    //卸载之前
    onBeforeUnmount(() => {
        window.removeEventListener('click',savePotint)
    })
    retuen point
}

index.vue
//引入hooks,使用即可

setup()

setup()定义数据和方法,需要使用return返回
setup的参数
-props:值为对象,组件外传递的数据,组件内声明定义接受的属性
-context:上下问对象
	1、attrs:值为对象,组件外部传递过来,但是在props配置中声明的属性,相当对this.$atrs
	2、slots:接受插槽的内容,相当于this.$solts
	3、emit:分发自定义事件的函数,相当于this.$emit

ref()

import {ref} form 'vue'
//定义基本和复杂数据类型(建议基本数据) 进行响应式
let name=ref("张三")

//模板使用不需要.value,操作时需要.value
//更改数据时 name.value=“666”

toRef

//可以把值返回成ref形式,只能处理一次数据
import{toRef}from 'vue'
const name=toRef(person,'name') 

toRefs

返回ref属性,可以批量操作

创建一个ref对象,其value值指向另一个对象的某个属性

<div>{{name}}</div>

import{toRefs}from 'vue'
setup(){
    const obj={
        name:'zhangsan',
        age:30
    }
    return{
        //使用toRefs转成ref形式
        ...toRefs(obj)
    }
}

reactive()

//定义object array数据类型 响应
import {reactive}form "vue"
//代理对象
let obj=reactive({
    anme:"fg",
    age:30
})

//操作数据和模板读取都不需要.value
obj.name="fg"

readonly

让一个响应式的数据只读(深只读)

shallowReadonly

让一个响应式的数据只浅读

toRaw

将一个由reactive生成的响应式对象转换为普通对象。用于读取对象的普通对象,对这个的普通对象的所有操作,不会引起页面更新。

markRaw

标记一个对象,使其用于不会成为响应式对象。有些值不应该被设置为响应式,例如复杂的第三方类库等。

computed()

//引入
import {computed}'vue'
computed()计算属性

//简写
let person=reactive({
firstName="zhang"
,lastName="3"
})

//计算属性(没有考虑计算属性被修改的情况)
/*person.fullName=computed(()=>{
return person.firstNaame+"-"+person.tlastName
})*/

//计算属性(完整的情况)
person.fullName=computed({
 get(){
return person.firstName+"-"+person.tlastName
}),
set(value){
const nameArr=value.split("-")
person.firstName=nameArr[0]
person.firstName=nameArr[1]
}
}

//返回数据
return {
person
}

watch

监听ref定义的响应数据
监听reactive定义的响应式数据时,deep不生效
监听reavtive定义的响应式数据中的某个属性时:deep生效
import {ref,reactive,watch}from'vue'


//场景一:监听ref所定义的一个响应式数据
/*
	watch(sumName,(newVlaue,oldValue)=>{
	console.log('sumName变了',newValue,oldValue)
	},{immediate:true})
*/
//场景2:监听ref所定义的多个数据
watch([sumName,msg],(newVlaue,oldValue)=>{
	console.log('sumName或msg变了',newValue,oldValue)
	},{immediate:true})
//场景3 监听reactive定义的一个响应式数据,(注:1、此处无法正确的获取oldValue。2、强制开启了深度监视deep:true)
watch(sumName,(newVlaue,oldValue)=>{
	console.log('sumName或msg变了',newValue,oldValue)
	},{deep:false})//此处的deep无效
//场景4、监视reactive定义的响应式数据的某个属性
watch(()=>person.name,(newVlaue,oldValue)=>{
	console.log('person.name变了',newValue,oldValue)
	})
//场景5 、监听某些属性
watch([()=>person.name,()=>person.age],(newVlaue,oldValue)=>{
	console.log('person.name变了',newValue,oldValue)
	})

watchEffect()

智能监听

//此方法可以不用指明监听谁,用到谁监听谁,不需要返回值。
import{watchEffect}from'vue'
watchEffect(()=>{
    const x1=sum.value;
    const x2=person.job.j1.salary;
    console.log('watchEffect所监听的回调函数')
})

组件通讯

//父传子
<template>
  <div>我是父组件{{str}}</div>
  <son mystr="1111" myid="666" :str="str" @fn="fn"></son>
</template>
​
<script>
import { ref } from "vue";
import son from "./son.vue";
​
export default {
  components: {
    son,
  },
  setup(prpos, { next }) {
    const str = ref("zhangsna");
    console.log(str);
    let fn = (n) => {
        console.log('woshifuzujain 777',n);
    };
    return {//返回数据
      str,
      fn
    };
  },
};
</script>
​
<style></style>
​
//子组件
<template>
  <div @click="fn1">我是子组件</div>
  <span>{{ "这是父组件的数据" }}</span>
  <span>{{ mystr }}</span>
  <span>{{ myid }}</span>
  <span>{{ str }}</span>
</template>
​
<script>
import { onMounted } from "vue";
export default {
    //需要props接收
  props: ["mystr", "myid", "str"],
  setup(props,  {emit} ) {//
    let str1 = null;
    console.log(props, 111);
 
    let fn1 = () => {
        //调用方法
      emit("fn",8888);
    };
    return {
      fn1,
    };
  },
};
</script>
​
<style></style>
 

###

祖先数据传递

//provide

//实现祖孙组件间的通讯,给自己的后代组件传递数据。

//provide(要传的名字,要传的数据)

import{reactive,toRefs,provide}from'vue'
import Child from'./components/Child.vue'
setup(){
    let car=reactive({name:"zhangsan",price:'40w'})
    provide('car',car)//要传的数据
return{...toRefs(car)}
    }
###

inject

后代组件获取祖先数据

import{inject}from'vue'
setup(){
    let car=inject('car')//接收祖先数据
    console.log(car)
}

###

响应式数据的判断

isRef //检查值是否为ref对象
isReactive //检查一个对象是否为reactive创建的响应式代理
isReadonly //检查一个对象是否有readonly创建的只读
isProxy //检查一个对象是否由reactive或readonly方法创建的代理
 isRef()//true
 isReactive()//true
 isReadonly()//true
 isProxy()//true

###

传送门

//要传送到哪里 body
<teleport to="body">
    ...
</teleport>

$naxtTick()

//在下一次DOM更新后执行指定的回调

this.$nextTick(function(){
    //更新后执行的代码
})

###

router

注:在vue3中没有this这个属性

//引入
import {useRouter}from'vue-router';
//赋值路由
setup(){
    const router =useRouter()//router===this.$router
    
    //路由跳转
    const handleChangePage=(id)=>{
        router.push(`/detail/${id}`)
    }
}
//引入
import {useRoute}from'vue-router';
//赋值路由
setup(){
    const router =useRoute()//router===this.$route
    
    //路由参数接收
   onMounted(()=>{
       console.log(route.params.id)
   })
}

###

vuex

import {useStore}from"vuex"//从vue3中获取你需要的操作方法
​
setup(){
    const store =useStore()
    onMounted(()=>{
        //调用vuex的方法
        store.commit('函数名')
    })
}

###

好了以上就是某些语法的使用,学会这些基本入门了。

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值