vue(2)

76 阅读3分钟

vue第二天

一、vue概念

1.v-text和v-html

目标:更新DOM对象的innerText/innerHTML

语法:

v-text="Vue数据变量" ,声明变量在data方法里面

注意: 会覆盖插值表达式,会把内容作为文本直接显示,不解析内容

语法:

v-html="Vue数据变量",声明变量在data方法里面

注意: 会覆盖插值表达式,会解析html标签

<template>
  <div>
    <!-- v-text: 作用,设置标签内容 -->
    <!-- 语法: v-text="变量" -->
    <!-- 变量声明在data方法返回对象里 -->
    <!-- v-text把内容作为文本直接显示,不解析内容 -->
    <h1 v-text="hello"></h1>
    <h1 v-text="helloHTML"></h1>

    <!-- v-html:作用,设置标签内容为HTML -->
    <!-- 语法:v-html="变量" -->
    <!-- 变量声明在data方法返回对象里 -->
    <!-- v-html会解析内容中的html标签 -->
    <h1 v-html="helloHTML"></h1>

    <h1 v-html="hello"></h1>
  </div>
</template>

<script>
export default {
  data() {
    return {
      hello: "hello world",
      helloHTML: "<button>点我</button>",
    };
  },
};
</script>

<style></style>

2.v-show和(v-if、v-else、v-else-if)

语法: v-show="Vue变量"
v-if="Vue变量" 原理 v-show 用的display:none隐藏 (频繁切换使用) v-if 直接从DOM树上移除 高级 v-else的使用

<template>
  <div>
    <!-- v-show -->
    <!-- 作用:控制标签显示和隐藏 -->
    <!-- v-show语法,v-show="表达式" -->
    <!-- v-show通过控制display: none属性来控制显示隐藏 -->
    <h1 v-show="age >= 18">成年人的快乐</h1>
    <h1 v-show="age < 18">给你一瓶营养快线</h1>

    <h1>v-if</h1>

    <!-- v-if -->
    <!-- 作用:控制标签显示和隐藏 -->
    <!-- v-if语法:v-if="表达式" -->
    <!-- v-if通过控制是否插入标签来显示隐藏 -->
    <h2 v-if="age < 18">给你甜甜圈</h2>
    <h2 v-if="age >= 18">快乐水</h2>
  </div>
</template>

<script>
export default {
  data() {
    return {
      age: 27,
    };
  },
};
</script>

<style></style>

<template>
  <div>
    <!-- v-if和v-else可以搭配使用 -->
    <!-- v-if和v-else必须是相邻节点 -->
    <h2 v-if="age < 18">给你甜甜圈</h2>
    <h2 v-else>快乐水</h2>

    <!-- v-if可以和多个v-else-if搭配使用,实现多个条件控制 -->
    <!-- 多个条件控制可以使用v-else结尾 -->
    <!-- v-else是可选的 -->
    <input type="text" v-model.number="age" />
    <h2 v-if="age < 18">甜甜圈</h2>
    <h2 v-else-if="age < 60">快乐水</h2>
    <h2 v-else-if="age < 100">脑白金</h2>
    <h2 v-else>冬虫夏草</h2>
  </div>
</template>

<script>
export default {
  data() {
    return {
      age: 8,
    };
  },
};
</script>

<style></style>

3.折叠面板
<template>
  <div>
    <!-- 第一步,先静后动,先实现静态的效果,把诗的标题、按钮、内容显示出来 -->
    <h1 class="text-center">案例:折叠面板</h1>
    <h2>
      静夜思
      <!-- 第二步,处理动态逻辑,给按钮绑定事件 -->
      <!-- 第五步,设置按钮文案 -->
      <button @click="toggle">{{ show ? "收起" : "展开" }}</button>
    </h2>
    <!-- 第三步,控制内容显示,使用v-show或者v-if -->
    <div v-show="show">
      <p>床前明月光</p>
      <p>疑是地上霜</p>
      <p>举头望明月</p>
      <p>低头思故乡</p>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      show: true,
    };
  },
  methods: {
    toggle() {
      // 第四步 在事件内部控制内容显示
      // 使用了取反运算
      this.show = !this.show;
    },
  },
};
</script>

<style>
.text-center {
  text-align: center;
}
</style>

4.vue动态设置class

目标: 用v-bind给标签class设置动态的值**

l 语法 :class="{类名: 布尔值}"

布尔值为true,标签增加类名,为false的时候删除类名

可以控制多个类

5.vue动态设置style

目标: 给标签动态设置style的值

语法 :style="{css属性名: 值}"

样式名如果带横线,改为小驼峰,也可以使用引号

二、品牌管理

1.品牌管理-列表-价格高亮
<tr v-for="item in list" :key="item.id">
    <th scope="row">{{ item.id }}</th>
    <td>{{ item.name }}</td>
    
    // 通过类名 添加价格判断布尔值添加类 实现高亮
    <td :class="{ expensive: item.price > 100 }">{{ item.price }}</td>
    <td>{{ item.time }}</td>
    <td>
       <button type="button" class="btn btn-link">删除</button>
    </td>
</tr>

// 添加高亮部分
<style scoped>
  .expensive {
     color: red;
        }
</style>
2.品牌管理-新增数据
// html部分
<form class="row align-items-center">
      <div class="col-3">
        <input
          type="text"
          class="form-control"
          placeholder="资产名称"
          v-model="productName"
        />
      </div>

      <div class="col-3">
        <input
          type="text"
          class="form-control"
          placeholder="价格"
          v-model="productPrice"
        />
      </div>

      <div class="col-3">
        <button
          type="submit"
          class="btn btn-primary"
          @click.prevent="addProduct"
        >
          添加资产
        </button>
      </div>
</form>

// js部分
  methods: {
    addProduct() {
      if (!this.productName || !this.productPrice) {
        alert("资产名称和价格不能为空");
        return;
      }
      // 第五步,处理空数据情况下的新增逻辑异常
      let id;
      if (this.list.length > 0) {
        id = this.list[this.list.length - 1].id + 1;
      } else {
        id = 100;
      }
      this.list.push({
        id,
        name: this.productName,
        price: this.productPrice,
        time: new Date(),
      });
    }
  },
3.品牌管理-删除
// html部分
<tr v-for="(item, index) in list" :key="item.id">
  <th scope="row">{{ item.id }}</th>
  <td>{{ item.name }}</td>
  <!-- 完成大于100值,实现字体高亮 -->
  <td :class="{ col: item.price > 100 }">{{ item.price }}</td>
  <td>{{ item.time | changeTime }}</td>
  <td>
    <button type="button" class="btn btn-link" @click="deleteProduct(index)"> 删除 </button>
  </td>
</tr> 

// js部分
methods: {
  // 删除
  deleteProduct(index) {
    this.list.splice(index, 1);
  },
},
4.品牌管理-总和、平均数
// html部分
<tr class="bg-light">
   <th scope="row">统计</th>
   <td colspan="2">总价:{{ total }}</td>
   <td colspan="2">均价:{{ pingjun }}</td>
</tr>

// js部分
computed: {
    total() {
      let total = 0;
      this.list.forEach((item) => {
        total += item.price;
      });
      return total;
    },
    pingjun() {
      let pingjun = this.total / this.list.length;
      return Math.round(pingjun);
    },
  },
5.品牌管理-时间格式转化(moment第三方包)
<p>{{ time | datefilter }}</p>

// 局部过滤器
filters: {
    datefilter(time) {
      return moment(time).format("YYYY-MM-DD");
    },
  }

三、 过滤器

1.作用:

转换格式, 过滤器就是一个函数, 传入值返回处理后的值

2.优点:

缓存计算结果,只有依赖项变化才会重新运算

3.用法:

(1)过滤器只能用在, 插值表达式v-bind动态属性里

(2)Vue中的过滤器场景

①字符串翻转, "输入hello, world", 输出"dlrow ,olleh”

②字母转大写, 输入"hello", 输出"HELLO”

(3)语法:

全局:Vue.filter("过滤器名", (值) => {return "处理后的值"})

Vue.filter("reversefn", (value) => {
  return value.split("").reverse().join("");
});

局部:filters: {过滤器名字: (值) => {return "处理后的值"}

<template>
  <div>
    //  过滤器作用:转换数据格式
    商品价格:{{ price | priceFilter }}

    <h2>{{ "hello" | toUpperCase }}</h2>

    //  过滤器能使用在插值表达式和v-bind属性里
    <p :title="'hello vue' | toUpperCase">hello vue</p>
  </div>
</template>

  // 声明在filters内的过滤器只能在当前vue文件使用
  filters: {
    // 过滤器要声明为方法
    // 表达式的值是过滤器的第一个参数
    priceFilter(num) {
      return `${num < 10 ? "0" + num : num}¥`;
    },
    toUpperCase(value) {
      return value.toUpperCase();
    },
  },

四、计算属性computed

1.作用:

一个变量的值, 依赖另外一些数据计算而来的结果

注意**: 计算属性也是vue数据变量, 所以不要和data里重名, 用法和data相同**

2.语法:
// 语法
{{ 变量 }}
// 计算属性:
computed:{ 
  函数(){
  set(value) {  }
  get() {}
  }
}

<div>
  <p>{{ sum }}={{ a }}+{{ b }}</p>
  a:<input type="text" v-model.number="a" /> <br />
  b:<input type="text" v-model.number="b" />
</div>

export default {
  data() {
    return {
      a: 10,
      b: 20,
    };
  },
  computed: {
    sum() {
      return this.a + this.b;
    },
  },
};
3.案例---全选框
<template>
  <div>
    <p>全选:<input type="checkbox" v-model="isAll" /></p>
    <ul>
      <li v-for="item in list" :key="item.id">
        <input type="checkbox" v-model="item.checked" />{{ item.name }}
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: [
        { id: 1, name: "猪八戒", checked: false },
        { id: 2, name: "悟空", checked: false },
        { id: 3, name: "唐僧", checked: false },
        { id: 4, name: "白龙马", checked: false },
      ],
    };
  },
  computed: {
    isAll: {
      //
      set(value) {
        // value--> true/false
        // console.log(value);
        this.list.forEach((item) => {
          item.checked = value;
        });
      },
      get() {
        let all = true;
        this.list.forEach((item) => {
          if (item.checked === false) {
            all = false;
          }
        });
        return all;
      },
    },
  },
};
</script>

<style></style>

4.案例-反选框

<button @click="btn">反选</button>

<script>
export default {
  // ...其他代码省略
  methods: {
    btn(){
      // 8. 让数组里对象的c属性取反再赋予回去
      this.arr.forEach(obj => obj.c = !obj.c)
    }
  }
};
</script>