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

Vue学习笔记: provide与inject

时间:2023-07-25 10:05:53浏览次数:42  
标签:changeTitle Vue provide navTitle vue inject 组件 import

在前几篇学习笔记里,接触到了props $eimt $parent $root 等方式实现父子组件间的数据传递方式,但是如果遇到层级很多的情况如何处理呢?

Vue学习笔记: provide与inject_ide

provide 和 inject 可以帮助我们解决这一问题。  一个父组件相对于其所有的后代组件,会作为依赖提供者。任何后代的组件树,无论层级有多深,都可以注入由父组件提供给整条链路的依赖。

Vue学习笔记: provide与inject_ide_02

为组件后代提供数据,使用 provide() 函数。

使用 inject() 函数,注入上层组件提供的数据。

注意:数据相应是由Root到底层组件的,所以inject到子组件的数据如果要响应到provide需要用computed与相应方法组合使用。


演示代码

App.vue

<template>
    <Navbar></Navbar>
    <Tabbar />
</template>
<script>
import { computed } from 'vue';
import Navbar from './Navbar.vue';
import Tabbar from './Tabbar.vue'
export default {
    data() {
        return { navTitle: '首页' }
    },
    components: {
        Navbar, Tabbar
    },
    methods: {
        changeTitle(title) {
            this.navTitle = title
            console.log(this.navTitle)
        }
    },
    provide() {
        return {
            changeTitle: this.changeTitle,
            navTitle: computed(()=>this.navTitle)
        }
    }
}
</script>

<style>
* {
    margin: 0;
    padding: 0;
}
</style>


Navbar.vue

<template>
    <div>
        <button>返回</button>
        <span>{{ navTitle }}</span>
        <button>首页</button>
    </div>
</template>
<script>
export default {
    inject:['navTitle']
}
</script>
<style scoped>
div {
    display: flex;
    width: 100%;
    justify-content: space-between;
    height: 50px;
    line-height: 50px;
    background: orange;
}
</style>

Tabbar.vue

<template>
    <ul>
        <TabbarItem v-for="data in datalist" :key="data" :item="data">{{ data }}</TabbarItem>
    </ul>
</template>
<script>
import TabbarItem from './TabbarItem.vue';
export default{
    data(){
        return{
            datalist:["首页","列表","我的"]
        }
    },
    components:{
        TabbarItem
    }
}
</script>

<style scoped>
ul{
    display: flex;
    position: fixed;
    bottom: 0;
    width: 100%;
    height: 50px;
    line-height: 50px;
}
li{
    flex:1;
    text-align: center;
}
</style>

TabbarItem.vue

<template>
    <li @click="handleClick">{{ item }}</li>
</template>
<script>
import App from './App.vue';

export default {
    props: ["item"],
    inject: ["changeTitle"],
    methods: {
        handleClick() {
            this.changeTitle(this.item)
         }
    }
}
</script>

Vue学习笔记: provide与inject_数据_03


标签:changeTitle,Vue,provide,navTitle,vue,inject,组件,import
From: https://blog.51cto.com/quietguoguo/6842497

相关文章

  • Vue2语法知识总结
    下面总结Vue2的语法知识1、插值语法<!DOCTYPEhtml><html> <head> <metacharset="utf-8"> <title>Vue插值语法</title> <scripttype="text/javascript"src="../javascriptdemo/vue.js"></script> &......
  • vue组件中引入自定义js文件
    在组件的script标签内直接引入:importmyFunctionfrom'@/util/custom.js'; 开始使用自定义js中的方法:exportdefault{//...otherVuecomponentoptionsmethods:{someMethod(){//Callthecustomfunctionfromyourcustom.jsmyFunctio......
  • 从vue2到vue3,自定义组件的v-model实现原理
    前言相信使用vue开发的同学应该都体会过v-model的便利,它可以非常方便地进行双向数据绑定,只要重新输入内容,视图就会立刻发生改变。本文将着重介绍如何在自定义组件当中使用v-model,以及在vue2和vue3中使用方式上的差异。概述v-model是一个语法糖,它在组件使用时相当于如下简写://......
  • vue 笔记暂存
    目录1:什么是Vue.js2:MVC和MVVM。3:为什么要学习前段框架4:框架和库的区别5:怎么使用Vue。6:常见的Vue指令7: 五大事件修饰符8:在vue中使用class样式9:使用内联样式 10:v-for指令11:v-if和v-show指令 小技巧:注意:总结:1:什么是Vue.js1.1:Vue.js 是目前最火的一个前端框架......
  • Vue WebSocket的实现 含断线重连
    vue客户端 main.jsimport{createApp}from'vue'import{reactive}from'vue'importAppfrom'./App.vue'import{webSocketUrl}from'/public/static/config.json'letwebsock=null;constapp=createApp(App);......
  • VUEX笔记
    VUEX笔记statestate:{ ip:''}gettersconstgetters={ ip:state=>state.ip}mutations同步操作this.$store.commit()mutations:{ SET_IP:(state,ip)=>{ state.ip=ip }}actions异步操作this.$store.dispatch()Action类似于mutati......
  • 实现在Vue应用中播放实时视频,使用WebRTC技术和Canvas API来完成
    要实现在Vue应用中播放实时视频,您需要使用WebRTC技术和CanvasAPI来完成。下面是基本的实现步骤:1.使用getUserMediaAPI获取用户的摄像头和麦克风访问权限;javascript复制代码navigator.mediaDevices.getUserMedia({video:true,audio:true}).then(function(stream){//......
  • SpringBoot+Vue实现校园二手系统。前后端分离技术【完整功能介绍+实现详情+源码】
    前言       这个系统基本上可以改造为其它类似的系统。后台管理基本上一致。前台进行一些页面样式的改造就可以变成一个新的系统。有时间,做几个变体系统。       闲的无聊,把大学时候做的一个系统进行了重构。将项目拆分成完全前后端分离的形式。客户端采用一套、商家......
  • 前端系列16集-vue3范型,vue-i18n-next,watch,watchEffect
    中台落地手记——业务服务化与数据资产化vue-i18n-nextvue3中使用i18n需要安装的是 [vue-i18nv9] 的版本npminstallvue-i18n@9创建src\lang\index.ts,使用 createI18n 创建i18n实例://src\lang\index.tsimport{createI18n}from'vue-i18n'import{LANG_......
  • Vue项目启动 报错error:0308010C:digital envelope routines::unsupported
    出现这个错误是因为node.jsV17版本中最近发布的OpenSSL3.0,而OpenSSL3.0对允许算法和密钥大小增加了严格的限制,可能会对生态系统造成一些影响.解决方法package.json增加配置"scripts":{"serve":"setNODE_OPTIONS=--openssl-legacy-provider&&vue-cli-serviceserve......