vue2.0(1)

129 阅读3分钟

Vue指令

插值表达式

//语法:{{表达式}}
<template>
  <div>
    <h1>{{ msg }}</h1>
    <h2>{{ obj.name }}</h2>
    <h3>{{ obj.age > 18 ? '成年' : '未成年' }}</h3>
  </div>
</template>

<script>
export default {
  data() { // 格式固定, 定义vue数据之处
    return {  // key相当于变量名
      msg: "hello, vue",
      obj: {
        name: "小vue",
        age: 5
      }
    }
  }
}
</script>

<style>
</style>
、、dom中插值表达式赋值,vue的变量必须在data里声明
<template>
  <div id="app">
    <!-- //插值表达式 -->
    <h1>{{ fd }}</h1>
    <!-- //不能写语句,如if,for循环等 -->
    <!-- 写对象 -->
    <!-- <h2>{{ obj.name }}</h2> -->
    <!-- 写三元表达式 -->
    <!-- <h2>{{ obj.age > 19 ? "成年" : "未成年" }}</h2> -->
    <button @click="btn">反转</button>
    <!-- 简写 -->
    <a :href="url"></a>
    <hr />
    <!-- 完整写法 -->
    <a v-bind:href="url">在跳</a>
  </div>
</template>

<script>
export default {
  data() {
    return {
      //声明数据
      fd: "你好猫咪",
      // obj: {
      //   name: "猫咪",
      //   age: 20,
      // },
      url: "http://baidu.com",
    };
  },
  methods: {
    btn() {
      this.fd = this.fd.split("").reverse().join("");
    },
  },
};
</script>
//样式
<style>
</style>

MVVM设计模式

设计模式: 是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结

1.gif

  • MVVM,一种软件架构模式,决定了写代码的思想和层次

    • M: model数据模型 (data里定义)
    • V: view视图 (html页面)
    • VM: ViewModel视图模型 (vue.js源码)

vue指令,v-bind

//语法:v-bind:属性名='vue变量'
//简写:属性名='vue变量'
<!--vue指令 v-bind属性动态赋值-->
<a v-bind:href='url'>这是a标签</a>
<img :src='imgSrc'>
//把vue变量的值,赋予给dom属性上,影响标签显示效果

v-on指令,给标签绑定事件

//v-on:事件名='要执行的代码'
//v-on:事件名='methods中的函数'
//v-on:事件名='methods中的函数(实参)'
//简写:@事件名='methods中的函数'
<template>
  <div id="app">
    <h1>商品数量{{ count }}</h1>

    <!-- 完整写法 -->
    <!-- <button v-on:click="count = count + 1">加1</button> -->
    <!-- 简写,带变量 -->
    <button @click="addFn">加1</button>
    <button @click="accFn">减1</button>
    <!-- 传参 (5)-->
    <button @click="addCount(5)">加5</button>
    <!-- 减5 -->
    <button @click="accCount(5)">减5</button>
    <!-- 清空 -->
    <button @click="zero">清零</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      count: 0,
    };
  },
  methods: {
  //无传参,通过形参直接接收
    addFn() {
      this.count++;
    },
    accFn() {
      this.count--;
    },
    addCount(num) {
      this.count += num;
    },
    //有传参,通过$event指代事件对象传给事件处理函数
    accCount(num) {
      this.count -= num;
    },
    zero() {
      this.count = 0;
    },
  },
};
</script>
//样式
<style>
</style>
//常用@事件名,给dom标签绑定事件,以及=号右侧的事件处理函数

v-on修饰符

<template>
  <!--.stop 阻止事件冒泡 -->
  <div id="app" @click="father">
    <button @click.stop="child">阻止</button>
    <!-- 阻止默认行为 .prevent -->
    <a href="http://baidu.com" @click.prevent>点击我不跳转</a>
    <!-- 运行期间只触发一次.once -->
    <button @click.once="btn">点我只触发一次</button>
    <!-- 键盘事件的修饰符 .enter,  .esc -->
    <input type="text" @keydown.enter="Enter" />
  </div>
</template>

<script>
export default {
  data() {
    return {};
  },
  methods: {
    father() {
      console.log("父元素触发");
    },
    child() {
      console.log(123, "父元素不触发");
    },
    btn() {
      console.log("只出现一次");
    },
    Enter() {
      console.log("按下了回车键");
    },
    esc() {
      console.log("取消了");
    },
  },
};
</script>
//样式
<style>
</style>

v-on按键修饰符

<template>
  <div>
    <input type="text" @keydown.enter="enterFn">
    <hr>
    <input type="text" @keydown.esc="escFn">
  </div>
</template>

<script>
export default {
 methods: {
   enterFn(){
     console.log("enter回车按键了");
   },
   escFn(){
     console.log("esc按键了");
   }
 }
}
</script>

2.8.0_练习_翻转世界.gif

<template>
  <div id="app">
    <h1>{{ test }}</h1>
    <button @click="revese">点我转过来</button>
  </div>
</template>


<script>
export default {
  data() {
    return {
      test: "hello,World",
    };
  },

  methods: {
    revese() {
      // this.text.split(""):字符串转成数组,revese()反转,join("")重新拼接
      this.test = this.test.split("").reverse().join("");
    },
  },
};
</script>

<style >
</style>

v-model指令,value属性和Vue数据变量,双向绑定到一起

//语法:v-model='Vue数据变量'
/* 
双向数据绑定
变量变化 -> 视图自动同步
视图变化 -> 变量自动同步
*/


<template>
  <div>
    <!-- 
    	v-model:是实现vuejs变量和表单标签value属性, 双向绑定的指令
    -->
    <div>
      <span>用户名:</span>
      <input type="text" v-model="username" />
    </div>
    <div>
      <span>密码:</span>
      <input type="password" v-model="pass" />
    </div>
    <div>
      <span>来自于: </span>
      <!-- 下拉菜单要绑定在select上 -->
      <select v-model="from">
        <option value="北京市">北京</option>
        <option value="南京市">南京</option>
        <option value="天津市">天津</option>
      </select>
    </div>
    <div>
      <!-- (重要)
      遇到复选框, v-model的变量值
      非数组 - 关联的是复选框的checked属性
      数组   - 关联的是复选框的value属性
       -->
      <span>爱好: </span>
      <input type="checkbox" v-model="hobby" value="抽烟">抽烟
      <input type="checkbox" v-model="hobby" value="喝酒">喝酒
      <input type="checkbox" v-model="hobby" value="写代码">写代码
    </div>
    <div>
      <span>性别: </span>
      <input type="radio" value="男" name="sex" v-model="gender">男
      <input type="radio" value="女" name="sex" v-model="gender">女
    </div>
    <div>
      <span>自我介绍</span>
      <textarea v-model="intro"></textarea>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      username: "",
      pass: "",
      from: "",
      hobby: [], 
      sex: "",
      intro: "",
    };
    // 总结:
    // 特别注意: v-model, 在input[checkbox]的多选框状态
    // 变量为非数组, 则绑定的是checked的属性(true/false) - 常用于: 单个绑定使用
    // 变量为数组, 则绑定的是他们的value属性里的值 - 常用于: 收集勾选了哪些值
  }
};
</script>

v-model修饰符

//语法:v-model.修饰符='vue数据变量'
//.number  以parseFloat转成数字类型
//.trim    去除首尾的空白字符串
//.lazy   在change时触发、而非input时
<template>
  <div>
    <div>
      <span>年龄:</span>
      <input type="text" v-model.number="age">
    </div>
    <div>
      <span>人生格言:</span>
      <input type="text" v-model.trim="motto">
    </div>
    <div>
      <span>自我介绍:</span>
      <textarea v-model.lazy="intro"></textarea>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      age: "",
      motto: "",
      intro: ""
    }
  }
}
</script>

v-text和v-html指令

//语法:
//v-text='vue数据变量',把值当成普通字符串显示
//v-html='vue数据变量',把值当成标签进行解析显示
//注意:会覆盖插值表达式
<template>
<div>
<p v-text='str'></p>
<p v-html='str'></p>
</div>
</template>

v-show和v-if指令,控制标签的隐藏或出现

//语法:
//v-show='vue变量',用的display:none隐藏(频繁切换使用)
//v-if='vue变量',直接从dom树上移出,可以配合v-else使用

<template>
  <div id="app">
    <!-- v-show:控制标签的隐藏或出现 ,频繁切换使用-->
    <h1 v-show="ok">出现</h1>
    <!--v-if:直接移除 ok状态值为false则不显示 -->
    <h2 v-if="ok">你好</h2>

    <button @click="btn">点我</button>
    <div>
      <!-- v-if和v-else搭配使用 -->
      <p v-if="age > 20">可以结婚了</p>
      <p v-else>差了点</p>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      ok: false,
      age: 22,
    };
  },
  methods: {
    btn() {
      this.ok = !this.ok;
    },
  },
};
</script>

<style>
</style>
//折叠面板小案例
<template>
  <div id="app">
    <div class="title">
      <h4>芙蓉楼送辛渐</h4>
      <span class="btn" @click="ok = !ok"> {{ ok ? "收起" : "展开" }} </span>
    </div>
    <div class="container" v-show="ok">
      <p>寒雨连江夜入吴,</p>
      <p>平明送客楚山孤。</p>
      <p>洛阳亲友如相问,</p>
      <p>一片冰心在玉壶。</p>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      ok: false,
    };
  },
};
</script>

<style>
body {
  background-color: #ccc;
}
#app {
  width: 400px;
  margin: 20px auto;
  background-color: #fff;
  border: 4px solid blueviolet;
  border-radius: 1em;
  box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.5);
  padding: 1em 2em 2em;
}
h3 {
  text-align: center;
}
.title {
  display: flex;
  justify-content: space-between;
  align-items: center;
  border: 1px solid #ccc;
  padding: 0 1em;
}
.title h4 {
  line-height: 2;
  margin: 0;
}
.container {
  border: 1px solid #ccc;
  padding: 0 1em;
}
.btn {
  /* 鼠标改成手的形状 */
  cursor: pointer;
}
</style>

案例_折叠面板.gif

v-for指令,列表渲染所在标签结构,按照数据数量,循环生成

//语法:
//v-for='(值变量,索引变量) in 目标结构'
//v-for='值变量 in 目标结构'
//可以变量数组、对象、数字、字符串(可遍历结构)

//注意:v-for的临时变量名不能用到v-for范围外

小案例。效果如下:

3.0_案例_购物车删除_干净了还有提示.gif

//-   需求1: 根据给的初始数据, 把购物车页面铺设出来
//-   需求2: 点击对应删除按钮, 删除对应数据
//需求3: 当数据没有了, 显示一条提示消息

<template>
  <div id="app">
    <table class="tb">
      <tr>
        <th>编号</th>
        <th>品牌名称</th>
        <th>创立时间</th>
        <th>操作</th>
      </tr>
      <!-- 循环渲染的元素tr -->
      <tr v-for="(item, index) in list">
        <td>{{ item.id }}</td>
        <td>{{ item.name }}</td>
        <td>{{ item.time }}</td>
        <td>
          <button @click="del(index)">删除</button>
        </td>
      </tr>
      <tr v-if="list.length == 0">
        <td colspan="4">没有数据咯~</td>
      </tr>
    </table>
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: [
        { id: 1, name: "奔驰", time: "2020-08-01" },
        { id: 2, name: "宝马", time: "2020-08-02" },
        { id: 3, name: "奥迪", time: "2020-08-03" },
      ],
      isOk: false,
    };
  },
  methods: {
    del(i) {
      this.list.splice(i, 1);
    },
  },
};
</script>

<style>
#app {
  width: 600px;
  margin: 10px auto;
}

.tb {
  border-collapse: collapse;
  width: 100%;
}

.tb th {
  background-color: #0094ff;
  color: white;
}

.tb td,
.tb th {
  padding: 5px;
  border: 1px solid black;
  text-align: center;
}

.add {
  padding: 5px;
  border: 1px solid black;
  margin-bottom: 10px;
}
</style>
//数组名.reduce()方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
//**注意:**  reduce() 对于空数组是不会执行回调函数的。,会有个返回值
let arr = [1, 2, 3, 4, 5, 6, 7]
        let res = arr.reduce((res, val) => (res += val), 0)
        console.log(res);
           //res=28