vue 构建单页应用3

事件调用方法时传递参数

  • 代码
# template
<!-- methods 传递参数的两种方法 -->
<button v-on:click="showParam1('我是参数1')">点我显示参数1</button>
<button data-param="我是参数2" @click="showParam2($event)">点我显示参数2</button>

# script
...
methods: {
    // 直接传参
    showParam1(str) {
        alert(str);
    },
    // 传递过来一个 事件对象 通过该对象获取参数
    showParam2(e) {
        console.log(e.srcElement.dataset.param);
    }
}
  • v-on:事件="调用方法(参数列表)" 可以简写为 @事件="方法(参数)"
  • 第一种方法是直接传递参数。
  • 第二种方法是传递 $event => 即触发事件的对象作为参数,并且在标签上使用 data-参数名 来配置参数。
  • 然后在方法参数列表中接收 $event ,然后通过 接收的event.srcElement.dataset.参数名 来实现读取标签上配置的参数。

第二种方法用于无法直接传参的情况。

创建新的初始化文件

  • 使用 vue create projectName vue-cli 创建新项目时,会让你选择一种初始化版本:
    • default => 带 babel, esLint
    • Manually select features => 自己选包
  • 选择 Manully => 【空格】选取创建项目时就自动带上的包,选好后【回车】,然后可以选择 Indedicated config files 输入一个名字,就可以再下次使用 vue-cli 创建项目时,选择通过这样的方式保存的预置配置了。

构建一个简单的“代办事项”

  • 增加、删除、遍历
# template

<!-- 文本框 -->
<input type="text" v-model="todo">
<!-- 添加按钮 -->
<button @click="add()">增加</button>
<hr>
<!-- 遍历数据 -->
<ul class="list">
    <!-- 使用 v-for="(单个对象, 该对象在集合中的下标)" 在循环中利用下标实现删除 -->
    <li v-for="(thing, key) of things" :key="thing.id"> {{ thing.id }} - {{ thing.todo }} <button @click="remove(key)">删除</button> </li>
</ul>

# script
export default {
  name: 'app',
  data() {
    return {
      todo: '', //文本框
      // 这是代办事项集合
      things: [
        {id: 1, todo: '请输入代办事项'},
      ],
    }
  },
  methods: {
    // 添加
    add() {
      // 先获得id
      var id = this.things.length;
      // 然后获取文本框能容
      var todo = this.todo;
      // 组装成和 things 中的每一项一样的格式(ES6语法, key: value 标识符是一样的时候,可以只写其中一个)
      var newThing = {id, todo};
      // 最后使用 push() 将新数据放进 this.things 中。
      this.things.push(newThing);
    },

    // 删除
    remove(key) {
      // 使用 splice(开始下标, 往后删除几个) 来删除数据 
      this.things.splice(key, 1);
    },
  }
}
  • 增加删除都使用 JS 提供的数组操作, push(在数组末尾添加的新元素值) & splice(从哪里开始删除的下标, 删除个数)
  • 在模板上遍历显示对象集合(数组)时,可以通过 v-for="(obj, index) of objs" 中的 index 来获取下标。

  • 完成后勾选功能的实现
# 修改 template
<ul class="list">
  <h2>代办</h2>
  <li v-for="(thing, key) of things" :key="thing.id" v-if="!thing.status">
      <input type="checkbox" v-model="thing.status">
      {{ thing.id }} - {{ thing.todo }} 
      <button @click="remove(key)">删除</button>
  </li>
  <hr>
  <h2>完成</h2>
  <li v-for="(thing, key) of things" :key="thing.id" v-if="thing.status" class="active">
      <input type="checkbox" v-model="thing.status">
      {{ thing.id }} - {{ thing.todo }} 
      <button @click="remove(key)">删除</button>
  </li>
</ul>

# 数据定义改一下
things: [
  {id: 0, todo: '请输入代办事项', status: false},
],  
  • 上面实现了修改 thing.status 的功能:使用 <input type="checkbox" v-model="thing.status"> 绑定当前被遍历事件的状态值,当勾选时,该值为 true。
  • 使用 v-if 来控制页面上元素的显示和隐藏。

  • 使用 localStorage 实现存储本地事件

    1. 新建 /src/module/storage.js
    /**
    * localStorage 封装
    */
    
    // 设置一个带有 set() 和 get() 方法的对象
    var storage = {
        // 设置
        set(key, value) {
            localStorage.setItem(key, JSON.stringify(value));
        },
    
        // 读取
        get(key) {
            return JSON.parse(localStorage.getItem(key));
        },
    }
    
    // 并包路这个对象
    export default storage;
    

    JSON.stringify(对象) => 对象转JSON字符串, JSON.parse(字符串) => 字符串转对象。

    1. 在 /src/App.vue 根组件中引用上面代码定义和暴露的模块
    // 引用对象
    import storage from "./module/storage";
    // console.log(storage);
    
    1. 在 添加,删除,清空三个方法中添加这样一句代码 storage.set('things', this.things); => 调用引用的 storage 对象的set() 方法。
    2. 使用 生命周期函数 mounted(): 当组件被挂载完成后自动调用,当页面刷新时读取存储在 localStorage 中的代办事项数据
    // 初始化函数
    mounted() {
      var things = storage.get('things');
      if(things) {
        this.things = things;
      }
    }
    
    1. 解决一个无法正确读取状态的问题:因为我们的“开关” <input type="checkbox" v-model="thing.status"> 在改变时没有进行 localstorage 的存储,所以需要在标签上添加一个被修改时触发的事件 @chage="saveStatus()" ,然后在 methods 里定义一个 saveStatus() 函数,调用 storage.set('things', this.things); 存储即可。

上面的知识用了 nodeJS 提供的模块化思想:定义并且使用 export 暴露某个对象。然后在其他文件使用 import 引用一些被暴露的对象。实现对象分类封装。

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

推荐阅读更多精彩内容