首页 > 其他分享 >[vue]精宏技术部试用期学习笔记 III

[vue]精宏技术部试用期学习笔记 III

时间:2023-11-02 20:16:45浏览次数:24  
标签:vue const 精宏 transStore pinia import 组件 试用期

精宏技术部试用期学习笔记(vue)

父子通信

什么是通信 / 为什么要通信

通信即在不同组件之间传输数据

  • 当在 复用组件 时,需要传递不同数据达成不同的表现效果

  • 能够根据其他组件的行动,响应式 的做出变化

Props

功能: 让父组件信息传递到子组件

code:

假定 index.vue 已经通过 router 挂载在了 '/' 路由下

//index.vue
<script setup>
import { ref } from 'vue';
import vue1 from '../components/vue1.vue';

const num1 = ref(15);
const increase = () => {
    num1.value += 1;
}

</script>

<template>
    <h1>Index Page</h1>
    <span>num1 = {{ num1 }}</span>
    <button @click="increase">increase</button>
    <vue1 :numFa="num1"></vue1>
</template>
//vue1.vue
<script setup>
    defineProps({
        numFa: Number
    })
</script>

<template>
    <h2>这是vue1组件</h2>
    <span>numFa: {{ numFa }}</span>
</template>
关于解构

定义之后直接使用就是响应式的

但如果解构之后不用 toRefs 则变成无法响应

    <script setup>
        import { toRefs } from 'vue';
        const props = defineProps({
            numFa: Number
        })

        // const { numFa = "none" } = props;
        //解构1 无法响应

        //const { numFa = "defualt" } = toRefs(props);
        //解构2 但是可以响应
    </script>

注意点:

  • 父组件在定义传递参数时需要使用响应式(ref)
  • 传递参数时,元素内要用 "v-bind:" 来连接响应式变量

ex 其他写法:

//非 <script setup> 写法
export default {
    props: {
        numFa: Number
    }
}
//ts写法
<script setup lang="ts">
defineProps<{
  title?: string
  likes?: number
}>()
</script>

Emit

原理

子元素触发 事件1 -> emit(传值) -> 父元素 事件2(监听-事件1) -> 获得子元素传值

code

//index.vue
<script setup>
import { ref } from 'vue';
import vue2 from '../components/vue2.vue';

const sonInfo = ref("");
const sonsetInfo = (value) => {
    sonInfo.value = value;
    alert(sonInfo.value);
}
</script>

<template>
    <h1>Index Page</h1>
    <vue2 @getText="sonsetInfo"></vue2>
</template>
//vue2.vue
<script setup lang="ts">
    import { ref } from 'vue';

    const emit = defineEmits(["getText"]);
    const text = ref("defualt");

    const getText = () => {
        emit("getText", text.value);
    };
</script>

<template>
    <h2>这是vue2组件</h2>
    <div>text: {{ text }}</div>
    <input type="text" v-model="text"><br>
    <button @click="getText">updata text</button>
</template>

pinia 组件通信

为什么使用 pinia

props 和 emit 是依托于父子组件的关系来传递变量

但在两个不相关的组件之间传递变量就会很麻烦

因此需要 pinia 来大统一变量

如何使用 pinia

1 安装 pinia

pnpm i pinia

安装好后能在 package.json 中查看

2 挂载 pinia

流程类似于 vue-router

这里对 pinia 进行了一个封装

让 mian.ts 高度精炼

同时创建了 stores文件夹

用来存放 pinia 相关文件

//./stores/index.ts
import { createPinia } from "pinia";
const pinia = createPinia();

export default pinia;
//main.ts
import pinia from './stores/index.ts';
app.use(pinia);

3 创建 pinia库

在 stores 中创建文件 transStore.ts

import { defineStore } from "pinia";
import { ref } from "vue";

const transStore = defineStore("trans", () => {
    const name = ref("Rosyr");
    //在库中定义响应式变量

    const setName = (nvalue: string) => {
        name.value = nvalue;
    };
    //使用setName函数 暴露name变量 (即让外界能访问到

    return {
        name,
        setName,
    }; 
    //用 return 进行开放store内部
});

export default transStore;

4 在 vue组件 中使用 pinia

import transStore from '../stores/transStore';

先导入库

const newTransStore = transStore();

创建变量存放库

  • 非响应式读取pinia库中的值
const namevalue = newTransStore.name;
  • 响应式读取pinia库中的值
import { storeToRefs } from 'pinia';

const {name} = storeToRefs(newTransStore);

pinia + vue-router

在 app 挂载的时候 router总会比pinia先挂载

因此要在router中使用pinia来实现路由守卫

需要在router中手动引入pinia

import { createPinia } from "pinia";
import transStore from '../stores/transStore';

const pinia = createPinia();
const newTransStore = transStore(pinia);

//...

标签:vue,const,精宏,transStore,pinia,import,组件,试用期
From: https://www.cnblogs.com/rosyr050301/p/vue_jinhong3.html

相关文章

  • 35-Vue脚手架-全局事件总线(使用全局事件总线优化Todo-List案例)
    全局事件总线(GlobalEventBus)1.一种组件间通信的方式,适用于任意组件间通信2.安装全局事件总线newVue({...//生命周期beforeCreate这时vue还未解析模板,初始化的数据监测、数据代理还未开始beforeCreate(){//安装全局事件总线Vue.prot......
  • vue3.0父级组件调用子组件方法
    vue3.0父级组件调用子组件方法场景:在页面开发过程中,我经常涉及到不同组件之间的元素和方法的调用。就此记录在vue3.0项目,也是我开发的开源项目中的实现方式。父级组件调用子级1.应用场景以下以我的代码实现为例:在左侧菜单中,通过点击新建会话,在会话列表中新建一个会话框。其中......
  • Docker打包前端vue代码推送镜像到远程仓库
    Docker打包前端vue代码推送镜像到远程仓库目录Docker打包前端vue代码推送镜像到远程仓库业务场景:......
  • Vue学习笔记1
    笔记脚手架文件结构├──node_modules├──public│├──favicon.ico:页签图标│└──index.html:主页面├──src│├──assets:存放静态资源││└──logo.png││──component:存放组件││└──HelloWorld.vue││......
  • vue3项目 - 手写可拖拽带进度监控的文件上传组件
    1.实现原理: 原生的上传文件组件: <inputref="uploadFileRef"style="display:none"type="file"/> 自定义上传区域:  拖拽事件添加(dragover,dragenter,drop),点击事件添加(click)调用原生上传组件的click事件:uploadFileRef.value.click()监听元素上传组件的值回传事件:c......
  • lottie在vue中的使用
    lottie官网:https://lottiefiles.com/1.安装依赖npminstalllottie-web2.创建lottie组件<template><div:style="style"ref="lavContainer"></div></template><script>importlottiefrom'lottie-web';......
  • vue3 google浏览器格式化控制台打印的数据
    ......
  • 在线直播系统源码,vue实现搜索文字高亮功能
    在线直播系统源码,vue实现搜索文字高亮功能1、在页面中使用v-html渲染 <template> <divclass="box">  <!--搜索框-->  <divclass="mySearch">   <van-search    v-model="PopUpSarCh"    show-action    placeholder=&......
  • vue vue.config.js 配置
    1.开启sourceMap//显示sourceMap,便于调试 //process.env.NODE_ENV有的是dev/prod,有的是development/production,需要自己确认下productionSourceMap:process.env.NODE_ENV!=='production',......
  • vuejs3.0 从入门到精通——基于 Vite 搭建 Vue3 项目
    基于Vite搭建Vue3项目 一、为什么选Vitehttps://www.vitejs.net/ 在浏览器支持ES模块之前,JavaScript并没有提供的原生机制让开发者以模块化的方式进行开发。这也正是我们对“打包”这个概念熟悉的原因:使用工具抓取、处理并将我们的源码模块串联成可以在浏览器中运......