vue3+element-plus

一、Vue3

1.setup函数

1.1概述

这个对象可以包含响应式数据、计算属性、方法、以及任何需要在模板中访问的内容。

1.2定义

setup 函数是 Vue 3 组件的一个新的入口函数,所有组件的逻辑都可以在这个函数内定义。它在组件实例创建之前调用,所以无法访问 this 关键字。

1.3参数

  • setup
    

    函数接受两个参数:

    1. props:一个包含所有传递给组件的 props 的对象。

    2. context

      :一个包含

      attrs
      

      ,

      slots
      

      , 和

      emit
      

      的对象。

      • attrs:所有未被 props 接收的属性。
      • slots:组件的插槽内容。
      • emit:用于触发事件的方法。

1.4返回值

setup 函数返回一个对象,这个对象中的属性和方法将会暴露给组件的模板使用。

1.5案例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vue 3 setup Example</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@3"></script>
</head>
<body>
    <div id="app">
        <Counter></Counter>
    </div>
    <script>
        const Counter = {
            template: `
                <div>
                    <h2>Counter: {{ count }}</h2>
                    <button @click="increment">Increment</button>
                    <button @click="decrement">Decrement</button>
                </div>
            `,
            setup() {
                // 定义响应式数据
                const count = Vue.ref(0);

                // 定义方法
                const increment = () => {
                    count.value++;
                };

                const decrement = () => {
                    count.value--;
                };

                // 返回数据和方法,以便在模板中使用
                return {
                    count,
                    increment,
                    decrement
                };
            }
        };

        Vue.createApp({
            components: {
                Counter
            }
        }).mount('#app');
    </script>
</body>
</html>

2.ref函数

2.1定义:

ref 是 Vue 3 提供的一个函数,用来创建响应式的引用。它接受一个初始值,并返回一个包含这个值的响应式对象。

2.2案例:

import { ref } from 'vue';

export default {
  setup() {
    // 创建一个响应式的数据 'count'
    const count = ref(0);

    // 定义增加计数的方法
    const increment = () => {
      count.value++;
    };

    // 返回数据和方法,以便在模板中使用
    return {
      count,
      increment
    };
  }
};

3.reactive函数

3.1定义

reactive 是 Vue 3 中用于创建深度响应式对象的函数。它接收一个普通的对象,并返回一个响应式代理对象,只能操作复制类型的数据。

3.2案例:

<template>
<div>
    <div>{{ obj.name }}</div>
    <div>{{ obj.password }}</div>
    <div>{{ obj.result.res.bes[0] }}</div>
    <button @click="btn">点击</button>
</div>
</template>
<script>
import{reactive, ref} from 'vue'
export default {
  setup(){
    const name="张三"
    const password='61281628'
    const result={
        res:{
            bes:[]
        }
    }
    const obj=reactive({
        name,
        password,
        result
    })
    const btn=()=>{
        obj.result.res.bes[0]='更深层的调用'
    }
    return{
        obj,btn
    }
  }
}
</script>

<style scoped>

</style>

4.toRef 函数

4.1定义:

toRef的本质是应用,与原始数据有交互,修改响应式数据会影响到源数据,但是不会更新视图层。

4.2案例:

<template>
<div>
    <div>{{ vof }}</div>
    <div>{{ vot.name }}</div>
    <div>{{ obj.name }}</div>
    <div>{{ obj.password }}</div>
    <div>{{ obj.result.res.bes[0] }}</div>
    <button @click="btn">点击</button>
</div>
</template>
<script>
import{reactive, ref, toRef} from 'vue'
export default {
  setup(){
    const vo="源数据"
    const vot={name:"源数据t",name2:"name2"}
    const vof=ref(vo)
    const voto=toRef(vot,"name")
    const name="张三"
    const password='61281628'
    const result={
        res:{
            bes:[]
        }
    }
    const obj=reactive({
        name,
        password,
        result
    })
    const btn=()=>{
        obj.result.res.bes[0]='更深层的调用'
        vof.value="修改后源数据"
        voto.name="修改后源数据t"
        console.log(vo)
        console.log(vot)
    }
    return{
        obj,btn,vof,vot,voto
    }
  }
}
</script>

<style scoped>

</style>

5.toRefs函数

5.1定义:

用于将一个响应式对象的所有属性转换为 ref 对象。每个 ref 对象保持与原始对象属性的双向绑定,从而在解构和传递时保持响应性。

5.2案例:

<template>
<div>
    <div>{{name}}</div>
    <div>{{age}}</div>
    <div>{{a}}</div>
    <div>{{b}}</div>
    <div>{{c}}</div>
    <div>{{d}}</div>
</div>
</template>

<script>
import { reactive,toRefs } from 'vue';
export default({
    setup(){
        const obj={name:'马云',age:50,a:70,b:12,c:133,d:13}
        const news=reactive(obj)
        const btn=()=>{

        }
        return {btn,...toRefs(news)}
    }
})
</script>
<style>
</style>

6.watch函数

6.1定义:

watch 是 Vue.js 中的一个选项,用于监听和响应 Vue 实例的数据变更。通过 watch,你可以在数据变化时执行一些自定义的逻辑,比如发起网络请求、执行复杂计算等。

6.2watchcomputed 的对比

  • computed:用于声明基于其他响应式数据的计算属性,计算属性的值会被缓存并仅在依赖的数据发生变化时重新计算。适用于需要计算值并在模板中使用的场景。
  • watch:用于响应式地监控数据变化,并在变化时执行某些逻辑。适用于需要在数据变化时执行副作用操作的场景。

6.3案例:

<template>
    <div>{{ p1 }}</div>
    <div>{{ p2 }}</div>
    <button @click="p1++">p1++</button>
    <button @click="p2+=2">p2+2</button>
    <button @click="p3.pass.word++">p3.pass.word++</button>
</template>
<script>
import { reactive,ref,watch } from 'vue';
export default({
    setup(){
        const p1=ref(1)
        const p2=ref(1)
        const p3=reactive({
            name:'aaa',
            pass:{
                word:1
            }
        })
        //watch监听一个数据
        // watch(p1,(newobj,oldobj)=>{
        //     console.log(newobj,oldobj)
        // })
        //watch监听多个数据
        // watch([p1,p2],(newobj,oldobj)=>{
        //     console.log(newobj,oldobj)
        // })
        //watch监听reactive响应式数据变化
        //只能监听到最新的结果,上一次的数据监听不到
        // watch(p3,(newval,oldval)=>{
        //     console.log(newval,oldval);
        // })
        //watch监听reactive响应式数据中某一个值的变化:最新结果和上一次的结果都可以得到
        watch(()=>p3.pass.word,(newval,oldval)=>{
            console.log(newval,oldval)
        },{immediate:true})//{immediate:true}在页面刷新时开启一次监听
        return{
            p1,p2,p3
        }
    }
})
</script>
<style>

</style>

7.watchEffect

7.1定义

watchEffect 是一个在 JavaScript 和类似 Vue.js 的框架中使用的函数,它会立即运行一个响应式副作用,并在其依赖项发生变化时重新运行。它通常用于 Vue 的 Composition API 中,自动跟踪依赖项并在必要时更新副作用。

7.2案例:

<template>
    <div>{{ p1 }}</div>
    <div>{{ p2 }}</div>
    <button @click="p1++">p1++</button>
    <button @click="p2+=2">p2+2</button>
    <button @click="p3.pass.word++">p3.pass.word++</button>
</template>
<script>
import { reactive,ref,watch, watchEffect } from 'vue';
export default({
    setup(){
        const p1=ref(1)
        const p2=ref(1)
        const p3=reactive({
            name:'aaa',
            pass:{
                word:1
            }
        })
        const res=watchEffect(()=>{
            console.log("监听到对象变化")
            const a=p1.value
            console.log(a)
        })
        res()
        return{
            p1,p2,p3
        }
        
    }
})
</script>
<style>
</style>

8.shallowRef和shallowReactive

8.1定义

在 Vue.js 的 Composition API 中,shallowRefshallowReactive 是用于创建响应式数据的函数。与普通的 refreactive 不同,它们只对对象的顶层属性进行响应式追踪,而不会递归地将对象内部的嵌套属性也变成响应式的。

8.2案例:

<template>
    <div>
        <h1>{{ name }}</h1>
        <h1>{{ age.num }}</h1>
        <h1>{{ p2 }}</h1>
        <button @click="age.num++">num++</button>
        <button @click="p2++">p2++</button>
    </div>
</template>
<script>
import { shallowReactive,shallowRef, toRefs, watch } from 'vue';
export default(
    {
        setup(){
            //shallowReactive:只处理第一层数据
            const p1=shallowReactive({
                name:'马玉',
                age:{
                    num:2
                }
            })
            //shallRef只处理基本类型数据
            const p2=shallowRef(0);

            watch(()=>p1.age.num,(newval,oldval)=>{
                console.log(newval,oldval)
            })
            return{
                ...toRefs(p1),p2
            } 
        }
    }
)
</script>
<style>
</style>

9.组件传值

9.1通过 provideinject,ref方法传值

  • 父组件
<template>
  <div class="back">
    我是父类组件
    <h1>{{ p1.name }}</h1>
    <h1>{{ p1.age }}</h1>
    <button @click="btn">调用子组件</button>
  </div>
  <div>
    <HelloWorld ref="val"/>
  </div>
</template>
<script>
import { provide, reactive,ref } from 'vue';
import HelloWorld from './components/vue3-组件传值.vue'
export default {
  name: 'App',
  components: {
    HelloWorld
  },
  setup(){
    //父组件通过方法向子组件传值
    const val=ref()
    const p2=ref({name:'father'})
    const btn=()=>{
      val.value.resa(p2)
    }
    //父组件向子组件传值
    const p1=reactive({name:'马云',age:50})
    provide('name',p1)//传
    
    
    return {p1,btn,val,p2}
  }
}
</script>

<style>
.back{
  background-color: blue;
  padding: 20px 0;
}
</style>
  • 子组件
<template>
    <div class="back">
        我是子类组件
        <h1>{{ p1.name }}</h1>
        <h1>{{ p1.age }}</h1>
    </div>
</template>
<script>
import { inject, provide, reactive,ref} from 'vue';

export default {
  setup(){
   //父组件通过方法向子组件传值
    const resa=p2=>{
        console.log('子组件被调用!')
        console.log(p2.value.name)
    }
 //父组件向子组件传值
    const p1=inject('name');
    console.log(p1)
    return{
        p1,resa
    }
  }
}
</script>
<style scoped>
.back{
    background-color: aqua;
    color:black;
    padding: 20px 0;
}
</style>

10.抽离封装

10.1定义

将重复使用的代码或逻辑提取出来,封装成可重用的组件、函数、或工具,以提高代码的可维护性和可复用性。

10.2案例:

  • 公用的数据或方法
//公用的数据或方法

import { reactive } from "vue";

const pubLic=()=>{
    const res_a=reactive({
        name:'马玉',
        age:50,
        company:'阿里巴巴'
    })
    return res_a
}
export default pubLic
  • 父组件
<template>
  <div class="back">
    我是父类组件
    <h1>{{ p1.name }}</h1>
    <h1>{{ p1.age }}</h1>
    <button @click="btn">修改父组件</button>
  </div>
  <div>
    <HelloWorld/>
  </div>
</template>
<script>
import HelloWorld from './components/vue3-封装抽离.vue'

import { provide, reactive,ref } from 'vue';
import pubLic from '../src/config/public'
export default {
  name: 'App',
  components: {
    HelloWorld
  },
  setup(){

    const p1=pubLic()
    return{
      p1
    }
  }
}
</script>
<style>
.back{
  background-color: blue;
  padding: 20px 0;
}
</style>
  • 子组件
<template>
    <div class="back">
        我是子类组件
        <h1>{{ name }}</h1>
        <h1>{{ age }}</h1>
        <h1>{{ company }}</h1>
    </div>
</template>
<script>
import { inject, provide, reactive, toRefs} from 'vue';
import publicScr from'../config/public'
export default {
  setup(){
    const p1=publicScr()
    return{
      ...toRefs(p1)
    }
  }
}
</script>
<style scoped>
.back{
    background-color: aqua;
    color:black;
    padding: 20px 0;
}
</style>

11.路由

11.1定义

当用户访问某个特定路径时,Vue Router 会根据定义的路由规则加载相应的组件。通过定义路由,开发者可以实现单页面应用程序(SPA)中的页面导航。

11.2配置

  • 创建并配置路由器 (router/index.js):
import { createRouter, createWebHashHistory } from "vue-router";
const routes=[
    {
        //登录页面
        path:'/',
        name:'login',
        component:()=>import(/*webpackChunkName:'Login'*/ '@/page/login/login.vue')
    }
]

const router=createRouter({
    history: createWebHashHistory(),
    routes,
})
export default router
  • main.js 中引入路由器:
import { createApp } from 'vue'
import App from './App.vue'
import router from './router/index.js'
const app=createApp(App)
app.use(router)
app.mount('#app')
  • 使用 <router-view> 渲染组件
<template>
  <router-view/>
</template>
<script>
export default{ 
}
</script>
<style>
</style>

二、element-plus

1.快速使用

  • yum安装element-plus
npm install element-plus --save
  • 引入main.js
import { createApp } from 'vue'
import App from './App.vue'
//路由
import router from './router/index.js'
//element-plus
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import zhCn from 'element-plus/es/locale/lang/zh-cn'


const app=createApp(App)
app.use(router)
//elementPlus引入
app.use(ElementPlus, {
    locale: zhCn,
  })
app.mount('#app')
    <link href="https://cdn.bootcdn.net/ajax/libs/normalize/8.0.1/normalize.min.css" rel="stylesheet">
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值