VUE 计算属性/监听/方法/样式/插槽/组件/v-once/非父子组件传值(bus和vuex)/localStorage

1.Vue 实例
  • 实例
<div id="root">{{message}}</div>

let vm = new Vue({
    el: '#root',
    data:{
        message: 'hellow world'
    }
}) 
创建一个vue实例  接管id为root的dom
  • 组件
定义一个组件
<item><item>

Vue.component('item', {
  template: '<div>heloo world</div>'
})

Vue的底层也会把component转换成 new Vue 实例
  • 浏览器打印vm 实例


    vm实例

    data

    通过vm.$el 把实例负责接管的dom最外层元素打印出来

    凡是以红框开始的东西,指的都是Vue实例属性或者实例方法
  • 销毁Vue 实例
vm.$destroy()
2.Vue 计算属性,方法和侦听器
  • 计算属性
计算属性

{{fullName}}

data:{
    firstName: 'Jack',
    lastName:'Lee',
},
computed:{
    fullName: function() {
        return this.firstName + ' ' + this.lastName
    }
}

计算属性非常重要的点:内置缓存,如果依赖的变量没有发生变化,计算属性就不会发生计算,用上次缓存的结果
  • 方法
{{fullName()}}

methods:{
  fullName: function(){
    return this.firstName + " " + this.lastName
  }
}

只要修改变量,方法就会执行一次,不论改变的是不是依赖的变量
  • 侦听器
data:{
  firstName:"jack",
  lastName:"Lee",
  fullName:"Dell lee",
  age: 28
},
watch:{
  firstName:function(){
    this.fullName=this.firstName + ' ' + this.lastName
  },
  lastName:function(){
    this.fullName=this.firstName + ' ' + this.lastName
  }
}
3.Vue 计算属性的setter和getter
data:{
  firstName:"jack",
  lastName:"Lee"
},
computed:{
  fullName:{
    get:function(){
      return this.firstName + " " + this.lastName
    },
    set:function(value){
      let arr = value.split(" ");
      this.firstName = arr[0];
      this.lastName = arr[1];
    }
  }
}
4.Vue 中的样式绑定
1. 根据变量显示class名
  :class="{activated: isActivated}"
2. 直接给变量添加class名
  :class="[activated,activatedOne]"
  data:{
    activated:"",
    activatedOne:"activated-one"
  }
3. 样式写成对象
  :style="styleObj"
  data:{
    styleObj: {
        color: "red"
    }
  }
  4. 样式写成数组
  :style="[styleObj,{fontSize: '20px' }]"
  data:{
    styleObj: {
        color: "red"
    }
  }
5.Vue 中使用插槽
不使用插槽时
<div id="root">
    <child content="<p>22222</p><p>22222</p><p>22222</p><p>22222</p>"></child>
</div>
<script>
  Vue.component('child', {
    props: ['content'],
    template: `<div>
                 <p>hello</p>
                 <div v-html="content"></div>
               </div>`
  })
  var vm = new Vue({
      el: '#root',
  })
</script>

优雅的使用插槽
<div id="root">
  <child></child>
</div>
<script>
  Vue.component('child', {
    template: `<div>
        <p>hello</p>
        <slot>默认内容</slot>  // 如果不写内容 就会显示默认内容
      </div>
    `,
  })
  var vm = new Vue({
    el: '#root',
  })
</script>

多个插槽同时使用(具名插槽)
<div id="root">
  <body-content>
    <div class="header" slot="header">header</div>
    <div class="footer" slot="footer">footer</div>
  </body-content>
</div>
<script>
  Vue.component('body-content', {
    template: `<div>
      <slot name="header"></slot>
      <p>hello</p>
      <slot name='footer'></slot>
    </div>`,
  })
  var vm = new Vue({
    el: '#root',
  })
</script>

Vue 中的作用域插槽(自定义循环标签)
<div id="root">
  <child>
    <template slot-scope="props">
      <p>{{props.item}}</p>
    </template>
  </child>
</div>
<script>
  Vue.component('child', {
    data: function () {
      return {
        list: [1, 2, 3, 4],
      }
    },
    template: `<div>
        <ul>
          <slot v-for="item of list" :item=item></slot>  
        </ul>
      </div>`,
  })

  var vm = new Vue({
    el: '#root',
  })
</script>
6.Vue 动态组件与v-once 指令
1.利用变量v-if控制显示
<div id="root">
  <child-one v-if="type==='child-one'"></child-one>
  <child-two v-else></child-two>
  <button @click="handleClickBtn">change</button>
</div>
<script>
  Vue.component('child-one', {
    template: '<div>child-one</div>',
  })
  Vue.component('child-two', {
    template: '<div>child-two</div>',
  })
  var vm = new Vue({
    el: '#root',
    data() {
      return {
        type: 'child-one',
      }
    },
    methods: {
      handleClickBtn() {
        this.type = this.type === 'child-one' ? 'child-two' : 'child-one'
      },
    },
  })
</script>
=========================================
2.动态组件
<div id="root">
  <component :is="type"></component>
  // 根据组件名称自动加载组件
  <button @click="handleClickBtn">change</button>
</div>
<script>
  Vue.component('child-one', {
    template: '<div>child-one</div>',
  })
  Vue.component('child-two', {
    template: '<div>child-two</div>',
  })
  var vm = new Vue({
    el: '#root',
    data() {
      return {
        type: 'child-one',
      }
    },
    methods: {
      handleClickBtn() {
        this.type = this.type === 'child-one' ? 'child-two' : 'child-one'
      },
    },
  })
</script>
=========================================
3. v-once 指令
<div id="root" v-once>
  <child-one v-if="type==='child-one'"></child-one>
  <child-two v-else></child-two>
  <button @click="handleClickBtn">change</button>
</div>
v-once 只渲染一次 未来即使变量发生变化 也不改变
7.Vue 非父子组件传值
  • bus
1. 发布订阅模式(Bus/总线/发布订阅模式/观察者模式)
  <div id="root">
    <child content="Dell"></child>
    <child content="Lee"></child>
  </div>
  Vue.prototype.bus = new Vue()
  Vue.component('child',{
    data: function(){
        return {
          selfContent: this.content
        }
    },
    props:{
        content: String
    },
    template:'<div @click="handleClick">{{selfContent}}</div>',
    methods:{
        handleClick: function(){
          this.bus.$emit('change',this.selfContent)
        }
    },
    mounted: function(){
        let _this = this
        this.bus.$on('change',function(msg){
           _this.selfContent= msg
        })
    }
  })
  • vuex


    Vuex
2. 官方提供Vuex
 · 组件调用dispatch方法来操作Actions
 · 组件/Actions调用Commit方法来操作Devtools去改变state中的数据

 · 安装与使用
  npm install vuex --save
src/store/index.js:
-------------------
 import Vue from 'vue'
 import Vuex from 'vuex'
  
 Vue.use(Vuex)

 export default new Vuex.Store({
      state:{
        city:'上海'
      }
  })


src/main.js:
-------------------
import store from './store'

创建根实例的时候 把store 传入
new Vue({
  el: '#app',
  store,
  ...
})

使用的时候  方法一:
  {{this.$store.state.city}}
修改的时候
  this.$store.dispatch('changeCity',city)

src/store/index.js:
-------------------
 import Vue from 'vue'
 import Vuex from 'vuex'
  
 Vue.use(Vuex)

 export default new Vuex.Store({
      state:{
        city:'上海'
      },
      actions: {
        changeCity (ctx,city) {
          // 调用mutations中的changeCity 
          ctx.commit('changeCity', city)
        }
      },
      mutations: {
        changeCity (state,city){
          state.city = city
        }
      }
  })
==============================
使用的时候 方法二(跳过dispatch步骤):
  {{this.$store.state.city}}
修改的时候
  this.$store.commit('changeCity',city)

src/store/index.js:
-------------------
 import Vue from 'vue'
 import Vuex from 'vuex'
  
 Vue.use(Vuex)

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