首页 > 其他分享 >Vue学习笔记:VCA下使用provide与 inject

Vue学习笔记:VCA下使用provide与 inject

时间:2023-08-02 16:03:57浏览次数:48  
标签:info VCA Vue const provide List Detail vue inject

在VCA模式下使用provide和inject与之前文档中VOA模式类似,不同 的是需要在使用前进行import

import { provide, inject } from 'vue'

在此篇文档中,使用一个示例来演示provide 与inject的使用

功能如下:

组件 Navbar Detail List部署在根组件App上。

在初始页面,显示Navbar与List。

List组件为列表形式,绑定click事件,点击后List隐藏,Detail显示。

Detail显示后Navbar隐藏。显示来源信息。提供一个按钮,点击按钮则返回初始状态,Navba显示,List显示,Detail隐藏

功能分析:

1、要实现组件切换可以使用component 的is属性

2、跨组件传递时间,需要使用provide与inject

具体实现:

App.vue

which用于切换显示List与Detail

show用于切换显示Navba

info用于在Detail中显示来源信息

<template>
    <Navbar v-show="show"/>
    <component :is="which"></component>
</template>
<script>
import Navbar from './Navbar.vue'
import List from './List.vue'
import Detail from './Detail.vue'
import {ref,provide} from 'vue'
export default{
    components:{
        Navbar,List,Detail
    },
    setup(){
        const which = ref('List')
        const show = ref(true)
        const info = ref('')
        provide("which", which)
        provide('show', show)
        provide('info', info)
        return {
            which,
            show
        }
    }
}
</script>

Navbar.vue

<template>
    <div>nav</div>
</template>
<script></script>

List.vue

在List.vue中使用inject获取App 提供的which 与info

<template>
    <div>
        <ul>
            <li v-for="data in datalist" :key="data" @click="handleClick(data)">{{ data }}</li>
        </ul>
    </div>
</template>
<script>
import { ref, inject } from 'vue'
export default {
    setup() {
        const datalist = ref(["aaa", "bbb", "ccc"])
        const which = inject("which")
        const info = inject('info')
        const handleClick = (data) => {
            console.log(data)
            which.value='Detail'
            info.value=data
        }
        return {
            datalist,
            handleClick
        }
    }
}
</script>

Detail.vue

<template>
    <div>
        <div>{{ info }}</div>
        <button @click="handelClick"> fanhui </button>
    </div>

</template>
<script>
import { inject, onMounted } from 'vue';
export default {
    setup() {
        const show = inject('show')
        const which = inject('which')
        const info = inject('info')
        onMounted(() => {
            show.value = false
        })
        const handelClick=function(){
            show.value = true
            which.value = 'List'
        }

        return {
            show,
            info,
            handelClick
        }
    }
}
</script>

实现效果

Vue学习笔记:VCA下使用provide与 inject_inject

标签:info,VCA,Vue,const,provide,List,Detail,vue,inject
From: https://blog.51cto.com/quietguoguo/6939423

相关文章

  • vue-让你的组件支持v-model
    原文:https://zhuanlan.zhihu.com/p/453112282在定义vue组件时,可以提供一个model属性,用来定义组件以何种方式支持v-model。model本身是有默认值的,如下:也就是说,如果你不定义model属性,或者按照上面的方式定义model属性,当其他人使用你的自定义组件时,v-model='foo',就等......
  • VUE后台管理系统(二)
    SPU管理先搞定静态组件(类似Attr管理的页面结构)###product.Spu.index.vue<template><div><!--三级联动结构(全局组件)--><el-cardstyle="margin:20px0px;"><!--传值show过去--><CategorySelect@getCategoryId="getCate......
  • 解决 Vue 重复点击相同路由,出现 Uncaught (in promise) NavigationDuplicated: Avoide
    解决Vue重复点击相同路由,出现Uncaught(inpromise)NavigationDuplicated:Avoidedredundantnavigation问题问题问题描述:重复点击导航时,控制台出现报错,虽然不影响功能使用,但也不能视而不见。解决方案方案一:只需在router文件夹下,添加如下代码。constrouter=new......
  • vue打开新窗口的两种方式
    1.使用路由跳转,绑定target="_blank"<router-linktarget="_blank":to="{path:'/pdf/download',params:{id:'8'}}"><el-buttontype="primary">ClicktodownloadPDF......
  • vue 获取当月第一天日期和最后一天日期
    //获取当月第一天数据getCurrentMonthFirst(){letdate=newDate()date.setDate(1)letmonth=parseInt(date.getMonth()+1)letday=date.getDate()if(month<10)month='0'+monthif(day<10)da......
  • vite+vue3+ts+elementPlus前端框架搭建 [一]
    记录下搭建vite+vue3+ts+elementPlus项目的过程及遇到的问题。建议使用pnpm安装依赖,npm切换到pnpm链接地址:[https://www.pnpm.cn/installation]() 1.运行环境node-vv18.17.0npm-v9.8.12.使用pnpm创建vite项目及安装依赖npminitvite-apppnpmcreate......
  • 【.NET6 + Vue3 + CentOS7.9 + Docker + Docker-Compose + SSL】个人博客前后端运维部
    个人博客前端:https://lujiesheng.cn个人博客后端:https://api.lujiesheng.cn个人博客运维:https://portainer.lujiesheng.cn1.服务器准备我采用的是腾讯云轻量应用服务器(2C4G8M80G),配置如下图:安装镜像选择CentOS7.664bit:2.服务器防火墙设置添加防火墙出入站规则......
  • vue 防连点
    directives:{preventReClick:{inserted:function(el,binding){el.addEventListener('click',(e)=>{if(!el.disabled){el.style.pointerEvents='none'setTimeout(()=>{......
  • vite 项目webstorm跳转失效 VSCode、vue 无法对 @ 路径 跳转 ,几乎适用于所有webpack、
    在根目录加一个jsconfig.json文件{"compilerOptions":{"baseUrl":".","paths":{"@/*":["src/*"]},"target":"ES6","allowSyntheticDefaultImports&q......
  • vue 通过css 给html元素增加前缀红色星号
    <el-form-item>前面增加红色星号要为<el-form-item>的label增加红色星号,你可以使用CSS中的伪元素::after或::before来实现。下面是如何在样式中添加红色星号的示例:<el-form-itemclass="red-label"label="物流商信息"></el-form-item><stylescopedlang="scss"......