vue实现两个组件之间数据共享和修改操作


Posted in Javascript onNovember 12, 2020

我们在使用vue开发过程中会遇到这样的情况,在父组件中引入了子组件,需要将父组件的值传到子组件中显示,同时子组件还可以更改父组件的值。

以我目前的一个项目的开发为例,如下图页面:

vue实现两个组件之间数据共享和修改操作

在父组件中,我引入了两个子组件,一个是左边的导航栏,还有中间的一个富文本编译器组件,当我点击左边导航栏时,中间的页面会切换,也就是改变引入的子组件。

怎么实现呢,首先,设置在该页面index.vue中设置一个变量index,左边导航栏每一项也对应一个index值,导航菜单绑定select函数,@select="handleSelect",@是v-on的简写。

handleSelect函数接收到参数,然后发射出去,再由父组件接收就可以了。

handleSelect(key, keyPath) {
  console.log(key, keyPath);
  this.changeIndex(keyPath[1])
  },
  changeIndex:function(key) {
  this.$emit("IndexChanged",key)
  }

this.$emit("IndexChanged",key)就是将key的值传到一个叫IndexChanged函数中,

在index.vue绑定IndexChanged接收值,<Aside v-on:IndexChanged="change($event)"> </Aside>然后调用change函数,注意$event是固定写法,接收的就是子页面传过来的key。然后就可以通过这个key改变index用来切换页面了。

下面通过一个更加简单直观的例子讲解一下,新建一个Test.vue:

<template>
 <div id="app">
 
 </div>
</template>
<script>
 export default{
 name:'Test',
 mounted() {

 },
 }
</script>

<style>
</style>

再建一个Test2.vue:

<template>

</template>

<script>
 export default {
 name: "Test2"
 }
</script>

<style scoped>
</style>

Test.vue是父组件,Test2.vue是子组件,下面先给Test配置路由,以便在浏览器上可以访问,为Test2定义模板,可以在Test中使用。

在router/index.js中添加下面代码

import Test from "../components/Test";
Vue.use(Router)

export default new Router({
 mode: 'history',
 routes: [
{
 path: '/t',
 name: 'Test',
 component: Test
 }
 ]
})

在main.js中,添加下面代码:

import Test2 from "./components/Test2";

Vue.use(Test2)
new Vue({
 el: '#app',
 router,
 components: {
 App,
 
 "Test2":Test2

 },

 template: '<App/>'
})

现在在test2页面写上这样一句,

<template>
<div>
 {{text2}}
</div>
</template>

<script>
 export default {
 name: "Test2",
 data(){
  return{
  text2:"这是Test2页面"
  }
 }

 }
</script>
<style scoped>

</style>

在test中引入test2,同时也定义一个变量text,然后显示在页面上,代码如下:

<template>
 <div id="app">
 {{text1}}
 <Test2></Test2>

 </div>
</template>
<script>

 import Test2 from "./Test2";
 export default{
 name:'Test',
 components: {Test2},
 data(){
  return{
  text1:"这是Test1页面"
  }
 },
 mounted() {
 },
 }
</script>

<style>
</style>

浏览器访问http://localhost:8080/t,页面如下:

vue实现两个组件之间数据共享和修改操作

现在要实现Test2接收Test1的值并显示:

绑定数据用v-bind

<Test2 v-bind:text1="text1"></Test2>

传的数据是Test页面的text1,命名也是text1,可以不同,但接收时的名字和第一个要相同。

Test2页面要接收数据啊,通过props接收:

props: ['text1'],

接收之后可以把它传给text2,也可以直接在页面显示:

<template>
<div>
 {{text2}}
 {{text1}}
</div>
</template>

<script>
 export default {
 name: "Test2",
 props: ['text1'],
 data(){
  return{
  text2:"这是Test2页面"
  }
 }

 }
</script>

<style scoped>
</style>

vue实现两个组件之间数据共享和修改操作

接收到text1值了,怎么同步更改呢,需要再绑定一个函数,如下:

<Test2 v-bind:text1="text1" v-on:textChanged="change($event)"></Test2>
....
methods: {
  change(msg){
  this.text1 = msg;
  }

 },

在test2中,将值发射到textChanged就可以了

mounted() {
  this.$emit("textChanged","我改了text1的值")
 }

vue实现两个组件之间数据共享和修改操作

补充知识:在vue中使用vuex,修改state的值

1、 安装 vuex

npm install vuex -S

2、在目录下创建store文件

vue实现两个组件之间数据共享和修改操作

3、 在store.js编辑一个修改state的方法

vue实现两个组件之间数据共享和修改操作

然后在mian.js中全局引入

vue实现两个组件之间数据共享和修改操作

最后在组件中使用

vue实现两个组件之间数据共享和修改操作

这个的功能是运用mutations 修改state中的值

以上这篇vue实现两个组件之间数据共享和修改操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 数组的 uniq 方法
Jan 23 Javascript
javascript不同类型数据之间的运算的转换方法
Feb 13 Javascript
jQuery控制TR显示隐藏的几种方法
Jun 18 Javascript
jQuery实现div横向拖拽排序的简单实例
Jul 13 Javascript
简单谈谈React中的路由系统
Jul 25 Javascript
详解require.js配置路径的用法和css的引入
Sep 06 Javascript
详解wow.js中各种特效对应的类名
Sep 13 Javascript
详解JS构造函数中this和return
Sep 16 Javascript
微信小程序支付之c#后台实现方法
Oct 19 Javascript
基于vue框架手写一个notify插件实现通知功能的方法
Mar 31 Javascript
微信小程序 腾讯地图SDK 获取当前地址实现解析
Aug 12 Javascript
JavaScript 实现页面滚动动画
Apr 24 Javascript
vue 解决mintui弹窗弹起来,底部页面滚动bug问题
Nov 12 #Javascript
vue打包通过image-webpack-loader插件对图片压缩优化操作
Nov 12 #Javascript
详解ES6 扩展运算符的使用与注意事项
Nov 12 #Javascript
在vue中使用image-webpack-loader实例
Nov 12 #Javascript
Vue向后台传数组数据,springboot接收vue传的数组数据实例
Nov 12 #Javascript
JavaScript ES 模块的使用
Nov 12 #Javascript
在vue中给后台接口传的值为数组的格式代码
Nov 12 #Javascript
You might like
通过缓存数据库结果提高PHP性能的原理介绍
2012/09/05 PHP
php利用单例模式实现日志处理类库
2014/02/10 PHP
ThinkPHP中自定义目录结构的设置方法
2014/08/15 PHP
php格式化日期实例分析
2014/11/12 PHP
谈谈PHP中substr和substring的正确用法及相关参数的介绍
2015/12/16 PHP
ucenter中词语过滤原理分析
2016/07/13 PHP
Laravel 框架控制器 Controller原理与用法实例分析
2020/04/14 PHP
前端开发的开始---基于面向对象的Ajax类
2010/09/17 Javascript
JS+CSS实现弹出全屏灰黑色透明遮罩效果的方法
2014/12/20 Javascript
Javascript中setTimeOut和setInterval的定时器用法
2015/06/12 Javascript
jQuery zTree树插件简单使用教程
2017/01/10 Javascript
vue移动端实现下拉刷新
2018/04/22 Javascript
React Native日期时间选择组件的示例代码
2018/04/27 Javascript
JavaScript实现随机五位数验证码
2019/09/27 Javascript
vue 实现v-for循环回来的数据动态绑定id
2019/11/07 Javascript
原生js实现无缝轮播图
2020/01/11 Javascript
Vue 中 template 有且只能一个 root的原因解析(源码分析)
2020/04/11 Javascript
jQuery实现的分页插件完整示例
2020/05/26 jQuery
[03:24][TI9纪实] Dota奶爸
2019/08/22 DOTA
在Python中使用模块的教程
2015/04/27 Python
总结Python中逻辑运算符的使用
2015/05/13 Python
pygame播放音乐的方法
2015/05/19 Python
详解使用 pyenv 管理多个版本 python 环境
2017/10/19 Python
Django配置celery(非djcelery)执行异步任务和定时任务
2018/07/16 Python
python实现字典嵌套列表取值
2019/12/16 Python
Python类中self参数用法详解
2020/02/13 Python
Python Sqlalchemy如何实现select for update
2020/10/12 Python
HTML5 使用 sessionStorage 进行页面传值的方法
2018/07/02 HTML / CSS
美国精品家居用品网站:US-Mattress
2016/08/24 全球购物
美国折扣宠物药房:Total Pet Supply
2018/05/27 全球购物
《鱼游到了纸上》教学反思
2014/02/20 职场文书
人事局接收函
2015/01/30 职场文书
党性教育心得体会(共6篇)
2016/01/21 职场文书
2016年感恩父亲节活动总结
2016/04/01 职场文书
Java新手教程之ArrayList的基本使用
2021/06/20 Java/Android
Python使用Web框架Flask开发项目
2022/06/01 Python