vue2.0传值方法的归纳

使用vue2.0做过几个项目,传值,最初只会emit的方法,导致整个项目都是emit,而且项目没有合理的划分,有些写成父子形式,传递是很方便的,而且整个项目逻辑也很清晰。

1.同辈组件传值,使用emit和on

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <div id="app">
            <v-hello></v-hello>
            <v-hi></v-hi>
        </div>
        <template id="vHello">
            <div>{{getData}}</div>
        </template>
        <template id="vHi">
            <button @click='chuan'>传值</button>
        </template>
    </body>
    <script src="vue.js"></script>
    <script>
        var newEvent = new Vue();
        Vue.component('v-hello',{
            template: '#vHello',
             data(){
                return{
                    getData:'无'
                }
            },
            mounted(){
                var that =this;
                newEvent.$on('res',function(data){
                    that.getData=data;
                })
            }
        });
        Vue.component('v-hi',{
            template: '#vHi',
            methods:{
                chuan(){
                    newEvent.$emit("res",'我收到啦')
                }
            }
        })
        new Vue({
            el: '#app',   
        })

    </script>
</html>

在这里我注册了两个同等级的组件,传值时候需要在全局的情况下,不能用this.$emit,所以我在这里var了一个全局的vue。
如果是在vue+webpack的架构下传值,一般我会先写一个eventBus.js,new一个全局的vue

import Vue from 'vue'
export default new Vue;

传值的时候,在需要使用的组件下导入

import bus from 'assets/eventBus';

使用方法:

bus.$emit("res",'我收到啦');
bus.$on('res',function(data){
          that.getData=data;
})

2.父子间传递,使用props

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <div id="app">
            <v-hello :name='res'></v-hello>
        </div>
        <template id="vHello">
            <div>{{getData}}</div>
        </template>
    </body>
    <script src="vue.js"></script>
    <script>
        var newEvent = new Vue();
        Vue.component('v-hello',{
            template: '#vHello',
             data(){
                return{
                    getData:'无'
                }
            },
            props:['name'],
            mounted(){
                var that =this;
                that.getData=that.name;
            }
        });
        new Vue({
            el: '#app',
            data(){
                return{
                    res:'这是父传的值'
                }
            }   
        })

    </script>
</html>

如果你想写一个点击事件,点击父然后传递给子元素,我觉得你可以在子元素写一个监听事件,监听值的实时变化

 Vue.component('v-hello',{
            template: '#vHello',
            props:['name'],
             data(){
                return{
                    getData:'无'
                }
            },
            watch:{
                 name(){
                      return this.name;
                 }
            },
            mounted(){
                var that =this;
                that.getData=that.name;
            }
        });

要注意的是,props是父传递给子,子传递给父的时候得使用第一种emit的方法传递。

3.使用路由传递值(底下这个例子是在vue+webpack的架构下传值的方法)

3.1params传值

第一步:路由配置:这种写法是需要在url显示,:name就是要传递的参数


router.png

第二步:父组件:这里我需要的数据比较多,所以通过params传递的值多,但是显示在url的只有name


index.png

如果不写router-link,点击跳转传值这里也可以这么写
this.$router.push({
         name: `video`,
         params:{
              name:name
         }
})

第三步:子组件


child.png

3.2query传值

注意:query传递的参数会显示在url后面?name=
路由配置

{
      path: '/shipin',
      name:'shipin',
      component: shipin,
      children:[
        {name:'shipin',path:'/shipin',component:mainVideo},
        {name:'video',path:'/shipin/video',component:singleVideo}
      ]
    },

父组件

this.$router.push({
         name: `video`,
         query:{
              name:name
         }
})

子组件

this.$route.query

4.使用vuex传值

犹豫平时做的项目的类别,基本没有用过vuex,个人认为vuex比较适合大型复杂的项目,多个组件之间传递状态,组件之类,例如登录,购物车等功能就挺适合的,有啥问题请多提出,这里不熟,先简单的说一下,后面等总结好了,再归纳
接下来这个例子我说一个简答的Loading功能:
建立一个vuex文件夹,里面包括的文件有


image.png

在main.js引用

import store from './vuex/store'
new Vue({
  el: '#app',
  router,
  store,
  template: '<App/>',
})

state.js Vuex store 实例的根 state 对象,这里当做state的最初对象

export default {
  // 页面是否在加载中
  isLoading: true
}

getters.js 这里我就当做获取loading状态

export default {
  // 得到是否加载中
  getloading: (state) => state.isLoading,
}

mutations.js 改变状态,处理数据,这里就是改变loading的状态

export default {
  // 设置是否在加载
  SET_LOADING (state, platform) {
    state.isLoading = platform
  },
}

actions.js 异步处理,通过mutations改变状态

export default {
  // 改变是否正在加载状态
  setLoading ({commit}, platform) {
    commit('SET_LOADING', platform)
  },
}

store.js

import Vue from 'vue'
import Vuex from 'vuex'
import state from './state'
import mutations from './mutations'
import getters from './getters'
import actions from './actions'
Vue.use(Vuex)
export default new Vuex.Store({
  state,
  mutations,
  getters,
  actions
})

把loading放在主页,app.vue,项目打开的时候出现Loading

<template>
  <div id="app">
     <transition name="router-fade" mode="out-in">
      <router-view></router-view>
    </transition>
    <!--是否显示加载图标,在首页根据渲染是否完成加载-->
    <div class="loading_jump" v-if="isLoading">
      <div class="loading_jump1"></div>
      <div class="loading_jump2"></div>
    </div>
  </div>
</template>
<script>
  export default {
    name: 'app',
    computed: {
      isLoading () {
        return this.$store.getters.getloading
      }
    },
      mounted(){
      }
  }
</script>

当页面加载完成之后,关闭loading

this.$store.dispatch('setLoading', false)

总结:后面的写的不咋地,以后会慢慢修改的,谢谢

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容