Vue案例(Day02)——品牌管理

43688b15e2c04e798c10ca8e2c59da70.png

 一、目标: 数据铺设

  • 📝需求1: 把默认数据显示到表格上

  • 📝需求2: 注意资产超过100的, 都用红色字体标记出来


1. 💡列表渲染指令(v-for),用来辅助开发者基于一个数组来循环渲染一个列表结构;

  •      key:给列表项添加的唯一标识。便于Vue进行列表项的正确排序复用

2.💡 v-bind对样式控制的增强-操作class;

  •      :class="{ 类名1: 布尔值, 类名2: 布尔值 }"。

3. 💡事件修饰符,@事件名.prevent —>阻止默认行为;

  •       a标签有默认行为-跳转刷新页面(如果有href属性)。

<tbody v-if="list.length > 0">
     <tr v-for="(item,index) in list" :key="item.id">
          <td>{{ item.id }}</td>
          <td>{{ item.name }}</td>

            <!-- 如果价格超过100,就有red这个类 -->
           <td :class="{ red:item.price > 100 }">{{ item.price }}</td>
           <td>{{ item.time }}</td>
           <td><a @click.prevent ="del(item.id)" href="#">删除</a></td>
      </tr>
     <tr style="background-color: #EEE">
          <td>统计:</td>
          <td colspan="2">总价为: {{ total }}</td>
          <td colspan="2">平均价: {{ average }}</td>
     </tr>
</tbody>

二、目标: 数据删除

  • 🧾需求3: 点击删除的a标签, 删除数据

  • 🧾需求4: 完成总价和均价


1. 🎯事件绑定指令(v-on: 简写为 @

  •    <button v-on:事件名="处理函数(实参)">按钮

  •    事件处理函数应该写到一个跟data同级的配置项(methods)中

  •    methods中的函数内部的this都指向Vue实例

2. 🎯computed计算属性,封装了一段对于数据的处理,求得一个结果

  •    计算属性会对计算出来的结果缓存,再次使用直接读取缓存;依赖项变化了,会自动重新计算 → 并再次缓存。
computed: {
  total() {
     return this.list.reduce((sum, item) => sum += item.price,0)
        },//用于将数组中的每个元素按顺序归约成单个值。它接受两个参数:一个回调函数和一个初始累加器的值。
   average() {
        if (this.list.length === 0) return 0; // 防止除以0的错误
          return this.total / this.list.length;
        }
},
methods:{
     del(id) {
          this.list = this.list.filter(item => item.id !== id)
        }// 获取当前行的id,利用filter进行过滤
}

三、目标: 数据新增

  • 📣需求5: 实现底部添加资产的功能


  1. 🪧双向绑定指令(v-model="变量")

  •    给表单元素(input、radio、select)使用,双向绑定数据,可以快速 获取设置 表单元素内容

  <form class="form-inline">
    <div class="form-group">
      <label>
        资产名称:<input v-model="name" type="text" class="form-control" placeholder="Name" />
      </label>
      <label>
        价格: <input v-model="price" type="text" class="form-control" placeholder="Price" />
      </label>
      <!-- 注意:一定要阻止表单的默认提交行为,否则刷新网页后数据就会恢复为原来的初始状态 -->
      <button class="btn btn-primary" @click.prevent="add">添加资产</button>
    </div>
    <br>
  </form>
add() {
          if(this.name.trim().length === 0 || this.price === 0) {
            alert("资产名称/价格不能为空")  //判断用户输入是否为空给提示
            return
          }
          if(isNaN(Number(this.price))) {
            alert("价格必须是数字")
            return
          }
          this.list.push({
            id: this.list[this.list.length -1].id + 1,
            name: this.name,
            price: Number(this.price),  // 正确地将字符串转换为数字
            time: new Date()
          })
          this.price = '',
          this.name= ''
        },

四、目标: 数据监听

  • 📚需求6: 侦听list变化, 同步到浏览器本地


1. 🔌持久化到本地: 在数据变化时都要更新下本地存储 watch

  •    immdiate:true 初始化 立刻执行一次

  •    deep:true 对复杂类型进行深度监听
const defaultArr = [
          { id: 100, name: "外套", price: 20, time: new Date('2010-08-12') },
          { id: 101, name: "裤子", price: 30, time: new Date('2013-09-01') },
          { id: 102, name: "鞋", price: 100, time: new Date('2018-11-22') },
          { id: 103, name: "帽子", price: 200, time: new Date('2020-12-12') }
        ]
const app = new Vue({
      el: '#app',
      data: {
        name: '', // 名称
        price: '', // 价格
        list: JSON.parse(localStorage.getItem('List')) || defaultArr,
      },
      watch: {
          list: {
            deep: true,
            handler (newValue) {
              // 需要将变化后的 newValue 存入本地 (转JSON)
              localStorage.setItem('List', JSON.stringify(newValue))
            }
          }
      }

五、完整代码

c4864d57c1fa4effb47f647b2812fa4f.gif

<!--初始代码-->
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="	https://cdn.jsdelivr.net/npm/bootstrap@3.7.0-alpha1/dist/css/bootstrap.min.css">
  <style>
    .red {
      color: red;
    }
  </style>
</head>
<body>
  <div id="app">
    <div class="container">
      <!-- 顶部搜索框模块 -->
      <div class="form-group">
        <div class="input-group">
          <h4>品牌管理</h4>
        </div>
      </div>
      <!-- 数据表格 -->
      <table class="table table-bordered table-hover mt-2">
        <thead>
          <tr>
            <th>编号</th>
            <th>资产名称</th>
            <th>价格</th>
            <th>创建时间</th>
            <th>操作</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td></td>
            <td></td>
            <!-- 如果价格超过100,就有red这个类 -->
            <td class="red"></td>
            <td></td>
            <td><a href="#">删除</a></td>
          </tr>
          <tr style="background-color: #EEE">
              <td>统计:</td>
              <td colspan="2">总价钱为: 100</td>
              <td colspan="2">平均价: 100</td>
        </tr>
        </tbody>
        <tfoot>
          <tr>
            <td colspan="5" style="text-align: center">暂无数据</td>
          </tr>
        </tfoot>
      </table>
      <!-- 添加资产 -->
      <form class="form-inline">
        <div class="form-group">
          <div class="input-group">
            <input type="text" class="form-control" placeholder="资产名称" />
          </div>
        </div>
        &nbsp;&nbsp;&nbsp;&nbsp;
        <div class="form-group">
          <div class="input-group">
            <input type="text" class="form-control" placeholder="价格" />
          </div>
        </div>
        &nbsp;&nbsp;&nbsp;&nbsp;
        <!-- 阻止表单提交 -->
        <button class="btn btn-primary">添加资产</button>
      </form>
    </div>
  </div>
  <script src="./vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        name: "", // 名称
        price: 0, // 价格
        list: [
          { id: 100, name: "外套", price: 199, time: new Date('2010-08-12') },
          { id: 101, name: "裤子", price: 34, time: new Date('2013-09-01') },
          { id: 102, name: "鞋", price: 25.4, time: new Date('2018-11-22') },
          { id: 103, name: "头发", price: 19900, time: new Date('2020-12-12') }
        ],
      }
    })
  </script>
</body>
</html>

<!--完整代码-->
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="	https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css">
  <style>
    .red {
      color: red;
    }
    #app {
      width: 1000px;
      margin: 20px auto;
      border-radius: 1em;
      padding: 1em 2em 2em;
    }
  </style>
</head>

<body>
  <div id="app">
    <div class="container">
      <!-- 顶部搜索框模块 -->
      <nav class="navbar  navbar-expand-lg  bg-body-tertiary">
        <div class="container-fluid">
          <div class="collapse navbar-collapse justify-content-between">
            <span class="navbar-brand">品牌管理</span>
            <form class="d-flex" role="search">
              <input  class="form-control me-2" placeholder="Search">
              <button class="btn btn-outline-success">Search</button>
            </form>
          </div>
        </div>
      </nav>

      <!-- 数据表格 -->
      <table class="table table-bordered table-hover mt-2">
        <thead>
          <tr>
            <th>编号</th>
            <th>资产名称</th>
            <th>价格</th>
            <th>创建时间</th>
            <th>操作</th>
          </tr>
        </thead>
        <tbody v-if="list.length > 0">
          <tr v-for="(item,index) in list" :key="item.id">
            <td>{{ item.id }}</td>
            <td>{{ item.name }}</td>

            <!-- 如果价格超过100,就有red这个类 -->
            <td :class="{ red:item.price > 100 }">{{ item.price }}</td>
            <td>{{ item.time }}</td>
            <td><a @click.prevent ="del(item.id)" href="#">删除</a></td>
          </tr>
          <tr style="background-color: #EEE">
              <td>统计:</td>
              <td colspan="2">总价为: {{ total }}</td>
              <td colspan="2">平均价: {{ average }}</td>
        </tr>
        </tbody>
        <tfoot v-else>
          <tr>
            <td colspan="5" style="text-align: center">暂无数据</td>
          </tr>
        </tfoot>
      </table>

      <!-- 添加资产 -->
      <form class="form-inline">
        <div class="form-group">
          <label>
            资产名称:<input v-model="name" type="text" class="form-control" placeholder="Name" />
          </label>
          <label>
            价格: <input v-model="price" type="text" class="form-control" placeholder="Price" />
          </label>
          <!-- 注意:一定要阻止表单的默认提交行为,否则刷新网页后数据就会恢复为原来的初始状态 -->
          <button class="btn btn-primary" @click.prevent="add">添加资产</button>
        </div>
        <br>
      </form>
    </div>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    const defaultArr = [
          { id: 100, name: "外套", price: 20, time: new Date('2010-08-12') },
          { id: 101, name: "裤子", price: 30, time: new Date('2013-09-01') },
          { id: 102, name: "鞋", price: 100, time: new Date('2018-11-22') },
          { id: 103, name: "帽子", price: 200, time: new Date('2020-12-12') }
        ]
    const app = new Vue({
      el: '#app',
      data: {
        name: '', // 名称
        price: '', // 价格
        list: JSON.parse(localStorage.getItem('List')) || defaultArr,
      },
      computed: {
        total() {
          return this.list.reduce((sum, item) => sum += item.price,0)
        },
        average() {
          if (this.list.length === 0) return 0; // 防止除以0的错误
          return this.total / this.list.length;
        }
      },
      methods:{
        del(id) {
          this.list = this.list.filter(item => item.id !== id)
        },
        add() {
          if(this.name.trim().length === 0 || this.price === 0) {
            alert("资产名称/价格不能为空")
            return
          }
          if(isNaN(Number(this.price))) {
            alert("价格必须是数字")
            return
          }
          this.list.push({
            id: this.list[this.list.length -1].id + 1,
            name: this.name,
            price: Number(this.price),  // 正确地将字符串转换为数字
            time: new Date()
          })
          this.price = '',
          this.name= ''
        },
      },
      watch: {
          list: {
            deep: true,
            handler (newValue) {
              // 需要将变化后的 newValue 存入本地 (转JSON)
              localStorage.setItem('List', JSON.stringify(newValue))
            }
          }
      }
    })
  </script>
</body>
</html>

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面我来为您介绍一下如何使用vue-router实现用户登录注册功能。 首先,我们需要安装vue-router,可以通过以下命令进行安装: ``` npm install vue-router --save ``` 然后,在main.js中引入并使用vue-router: ``` import VueRouter from 'vue-router' Vue.use(VueRouter) ``` 接下来,我们新建一个router.js文件,用于配置路由。在该文件中,我们需要定义路由路径和路由组件: ``` import Vue from 'vue' import VueRouter from 'vue-router' import Login from './components/Login.vue' import Register from './components/Register.vue' Vue.use(VueRouter) const routes = [ { path: '/login', component: Login }, { path: '/register', component: Register } ] const router = new VueRouter({ routes }) export default router ``` 在上面的代码中,我们定义了两个路由路径:/login和/register,并分别对应了Login和Register两个组件。 接下来,在App.vue中,我们需要使用<router-view>标签来显示路由组件: ``` <template> <div id="app"> <router-view></router-view> </div> </template> ``` 最后,在main.js中引入router.js,并将其挂载到Vue实例中: ``` import Vue from 'vue' import App from './App.vue' import router from './router' Vue.config.productionTip = false new Vue({ router, render: h => h(App), }).$mount('#app') ``` 至此,我们已经完成了基本的路由配置。接下来,我们可以在Login和Register组件中实现具体的登录和注册功能。 在Login组件中,我们可以使用Vue.js提供的v-model指令来绑定表单输入的数据,并在点击登录按钮时向服务器发送请求验证用户名和密码: ``` <template> <div class="login"> <h1>登录</h1> <form> <label>用户名:</label> <input type="text" v-model="username"> <br> <label>密码:</label> <input type="password" v-model="password"> <br> <button @click.prevent="login">登录</button> </form> </div> </template> <script> export default { data() { return { username: '', password: '' } }, methods: { login() { // 向服务器发送请求验证用户名和密码 } } } </script> ``` 而在Register组件中,我们可以使用v-model指令来绑定表单输入的数据,并在点击注册按钮时向服务器发送请求创建新用户: ``` <template> <div class="register"> <h1>注册</h1> <form> <label>用户名:</label> <input type="text" v-model="username"> <br> <label>密码:</label> <input type="password" v-model="password"> <br> <label>确认密码:</label> <input type="password" v-model="confirmPassword"> <br> <button @click.prevent="register">注册</button> </form> </div> </template> <script> export default { data() { return { username: '', password: '', confirmPassword: '' } }, methods: { register() { // 向服务器发送请求创建新用户 } } } </script> ``` 到这里,我们已经完成了一个简单的用户登录注册功能,并使用vue-router实现了路由跳转。当用户访问/login时,会显示Login组件;当用户访问/register时,会显示Register组件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值