VUE学习二:事件监听(v-on)、条件判断(v-if/v-else-if/v-else)、循环遍历(v-for)

简介: 这篇文章是关于Vue.js的学习指南,涵盖了事件监听、条件判断、循环遍历、数组方法响应性、案例分析以及高阶函数的使用。

导言

一、v-on指令:01-事件监听

1. 01-v-on的基本使用.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>01-v-on的基本使用</title>
</head>
<body>

<div id="app">
  <h2>{
  {counter}}</h2>
  <!--<h2 v-bind:title></h2>-->
  <!--<h2 :title></h2>-->

  <h1>第一种写法:直接写操作</h1>
  <button v-on:click="counter++">+</button>
  <button v-on:click="counter--;">-</button>

  <h1>第二种写法:方法名</h1>
  <button v-on:click="increment">+</button>
  <button v-on:click="decrement">-</button>

  <h1>第三种写法:语法糖  类似于 v-bind 等价于 :(冒号)</h1>
  <button @click="increment">+</button>
  <button @click="decrement">-</button>
</div>

<script src="../../lib/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      counter: 0
    },
    methods: {
      // es5 写法
      increment: function() {
        this.counter++
      },
      // es6 增强写法
      decrement: function() {
        this.counter--
      }
    }
  })
</script>

</body>
</html>

在这里插入图片描述

2. 02-v-on的参数问题.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>02-v-on的参数问题</title>
</head>
<body>

<div id="app">
  <h1>1.事件调用的方法没有参数(小括号可有可无)</h1>
  <button @click="btn1Click()">按钮1</button>
  <button @click="btn1Click">按钮1</button><br/>

  <!--2.在事件定义时, 写方法时省略了小括号, 但是方法本身是需要一个参数的,
  这个时候, Vue会默认将浏览器生产的event事件对象作为参数传入到方法-->
  <h1>2.在事件定义时, 写方法时省略了小括号, 但是方法本身是需要一个参数的,这个时候, Vue会默认将浏览器生产的event事件对象作为参数传入到方法</h1>
  <button @click="btn2Click(123)">按钮2-1</button>
  <button @click="btn2Click()">按钮2-2</button>
  <button @click="btn2Click">按钮2-3</button><br>

  <!--3.方法定义时, 我们需要event对象, 同时又需要其他参数-->
  <!-- 在调用方式, 如何手动的获取到浏览器参数的event对象: $event-->
  <h1>3.方法定义时, 我们需要event对象, 同时又需要其他参数, 在调用方式, 如何手动的获取到浏览器参数的event对象: $event</h1>
  <button @click="btn3Click(abc, $event)">按钮3</button>
</div>

<script src="../../lib/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      message: '你好啊',
      abc: 123
    },
    methods: {
      btn1Click() {
        console.log("btn1Click");
      },
      btn2Click(event) {
        console.log('--------', event);
      },
      btn3Click(abc, event) {
        console.log('++++++++', abc, event);
      }
    }
  })

  // 如果函数需要参数,但是没有传入, 那么函数的形参为undefined
  // function abc(name) {
  //   console.log(name);
  // }
  //
  // abc()
</script>

</body>
</html>

在这里插入图片描述

3. 03-v-on的修饰符.html

冒泡事件:外面的事件 触发 内层的事件

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>v-on的修饰符</title>
</head>
<body>

<div id="app">
  <!--冒泡事件:外面的事件 触发 内层的事件-->
  <h1>1. .stop修饰符的使用: 阻止冒泡事件</h1>
  <div @click="divClick">
    aaaaaaa
    <button @click.stop="btnClick">按钮</button>
  </div>

  <h1>2. .prevent 修饰符的使用:阻止默认事件</h1>
  <br>
  <form action="baidu">
    <input type="submit" value="提交" @click.prevent="submitClick">
  </form>

  <h1>3. .监听某个键盘的键帽</h1>
  <!--keyup: 监听所有按键
      enter: 监听 enter 按键的使用-->
  <input type="text" @keyup.enter="keyUp"><br>

  <h1>4. .once修饰符的使用:只让第一次点击有效,以后再点无效</h1>
  <button @click.once="btn2Click">按钮2</button>
</div>

<script src="../../lib/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      message: '你好啊'
    },
    methods: {
      btnClick() {
        console.log("btnClick");
      },
      divClick() {
        console.log("divClick");
      },
      submitClick() {
        console.log('submitClick');
      },
      keyUp() {
        console.log('keyUp');
      },
      btn2Click() {
        console.log('btn2Click');
      }
    }
  })
</script>

</body>
</html>

二、v-if和v-else:02-条件判断

1. 01-v-if的使用.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>01-v-if的使用</title>
</head>
<body>

<div id="app">
  <h2 v-if="isShow">
    <div>abc</div>
    <div>abc</div>
    <div>abc</div>
    <div>abc</div>
    <div>abc</div>
    {
  {message}}
  </h2>
</div>

<script src="../../lib/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      message: '你好啊',
      isShow: true
    }
  })
</script>

</body>
</html>

在这里插入图片描述

2. 02-v-if和v-else的使用.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>02-v-if和v-else的使用</title>
</head>
<body>

<div id="app">
  <h2 v-if="isShow">
    <div>abc</div>
    <div>abc</div>
    <div>abc</div>
    <div>abc</div>
    <div>abc</div>
    {
  {message}}
  </h2>
  <!-- <h1 v-else>isShow为false时, 显示我</h1> -->
  <button v-else @click="isShow = !isShow">isShow为false时, 显示我,点击我就没啦</button>
</div>

<script src="../../lib/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      message: '你好啊',
      isShow: false
    }
  })
</script>

</body>
</html>

在这里插入图片描述

3. 03-v-if和v-else-if和v-else的使用.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>03-v-if和v-else-if和v-else的使用</title>
</head>
<body>

<div id="app">
  <h2 v-if="score>=90">优秀</h2>
  <h2 v-else-if="score>=80">良好</h2>
  <h2 v-else-if="score>=60">及格</h2>
  <h2 v-else>不及格</h2>

  <h1>{
  {result}}</h1>
</div>

<script src="../../lib/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      score: 99
    },
    computed: {
      result() {
        let showMessage = '';
        if (this.score >= 90) {
          showMessage = '优秀'
        } else if (this.score >= 80) {
          showMessage = '良好'
        }
        // ...
        return showMessage
      }
    }
  })
</script>

</body>
</html>

在这里插入图片描述

4. 04-用户登录切换的案例.html

  • 存在的问题:
    如果我们在有输入内容的情况下,切换了类型,我们会发现文字依然显示之前的输入的内容。
    但是按道理讲,我们应该切换到另外一个input元素中了。
    在另一个input元素中,我们并没有输入内容。
    为什么会出现这个问题呢?
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>04-用户登录切换的案例</title>
</head>
<body>

<!--
出现的问题:
如果我们在有输入内容的情况下,切换了类型,我们会发现文字依然显示之前的输入的内容。
但是按道理讲,我们应该切换到另外一个input元素中了。
在另一个input元素中,我们并没有输入内容。
为什么会出现这个问题呢?
-->

<div id="app">
  <span v-if="isUser">
    <label for="username">用户账号</label>
    <input type="text" id="username" placeholder="用户账号">
  </span>
  <span v-else>
    <label for="email">用户邮箱</label>
    <input type="text" id="email" placeholder="用户邮箱">
  </span>
  <button @click="isUser = !isUser">切换类型</button>
</div>

<script src="../../lib/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      isUser: true
    }
  })
</script>

</body>
</html>

5. 05-用户登录切换的案例(小问题).html(解决上一节问题)

  • 问题解释:
    这是**因为Vue在进行DOM渲染时,出于性能考虑,会尽可能的复用已经存在的元素,而不是重新创建新的元素**。
    在上面的案例中,Vue内部会发现原来的input元素不再使用,直接作为else中的input来使用了。

  • 解决方案:
    如果我们不希望Vue出现类似重复利用的问题,可以给对应的input添加key
    并且我们需要保证key的不同

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>05-用户登录切换的案例(小问题)</title>
</head>
<body>

<!--
问题解释:
这是因为Vue在进行DOM渲染时,出于性能考虑,会尽可能的复用已经存在的元素,而不是重新创建新的元素。
在上面的案例中,Vue内部会发现原来的input元素不再使用,直接作为else中的input来使用了。

解决方案:
如果我们不希望Vue出现类似重复利用的问题,可以给对应的input添加key
并且我们需要保证key的不同
-->

<div id="app">
  <span v-if="isUser">
    <label for="username">用户账号</label>
    <input type="text" id="username" placeholder="用户账号" key="username">
  </span>
  <span v-else>
    <label for="email">用户邮箱</label>
    <input type="text" id="email" placeholder="用户邮箱" key="email">
  </span>
  <button @click="isUser = !isUser">切换类型</button>
</div>

<script src="../../lib/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      isUser: true
    }
  })
</script>

</body>
</html>

6. 06-v-show的使用.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>06-v-show的使用</title>
</head>
<body>

<div id="app">
  <h1>v-if: 当条件为false时, 包含v-if指令的元素, 根本就不会存在dom中</h1>
  <h2 v-if="isShow" id="aaa">{
  {message}}</h2>

  <h1>v-show: 当条件为false时, v-show只是给我们的元素添加一个行内样式: display: none</h1>
  <h2 v-show="isShow" id="bbb">{
  {message}}</h2>
</div>

<script src="../../lib/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      message: '你好啊',
      isShow: true
    }
  })
</script>

</body>
</html>

在这里插入图片描述

三、03-循环遍历

1. 01-v-for遍历数组.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>01-v-for遍历数组</title>
</head>
<body>

<div id="app">
  <!--1.在遍历的过程中,没有使用索引值(下标值)-->
  <h1>1.在遍历的过程中,没有使用索引值(下标值)</h1>
  <ul>
    <li v-for="item in names">{
  {item}}</li>
  </ul>

  <!--2.在遍历的过程中, 获取索引值-->
  <h2>2.在遍历的过程中, 获取索引值</h2>
  <ul>
    <li v-for="(item, index) in names">
      {
  {index+1}}.{
  {item}}
    </li>
  </ul>
</div>

<script src="../../lib/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      names: ['why', 'kobe', 'james', 'curry']
    }
  })
</script>

</body>
</html>

在这里插入图片描述

2. 02-v-for遍历对象.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>02-v-for遍历对象</title>
</head>
<body>

<div id="app">

  <!--0.直接点出来属性-->
  <h1>0.直接点出来属性</h1>
  <ul>
    <li >{
  {info.name}}</li>
    <li >{
  {info.age}}</li>
    <li >{
  {info.height}}</li>
  </ul>

  <!--1.在遍历对象的过程中, 如果只是获取一个值, 那么获取到的是value-->
  <h1>1.在遍历对象的过程中, 如果只是获取一个值, 那么获取到的是value</h1>
  <ul>
    <li v-for="item in info">{
  {item}}</li>
  </ul>


  <!--2.获取key和value 格式: (value, key) -->
  <h1>2.获取key和value 格式: (value, key)</h1>
  <ul>
    <li v-for="(value, key) in info">{
  {value}}-{
  {key}}</li>
  </ul>


  <!--3.获取key和value和index 格式: (value, key, index) -->
  <h1>3.获取key和value和index 格式: (value, key, index)</h1>
  <ul>
    <li v-for="(value, key, index) in info">{
  {value}}-{
  {key}}-{
  {index}}</li>
  </ul>
</div>

<script src="../../lib/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      info: {
        name: 'feng',
        age: 18,
        height: 1.88
      }
    }
  })
</script>

</body>
</html>

在这里插入图片描述

3. 03-v-for使用过程添加key.html

input 表单中也可以加key,是为了怕复用
也是二.4和二.5的问题

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>03-v-for使用过程添加key</title>
</head>
<body>

<!-- input 表单中也可以加key,是为了怕复用-->

<div id="app">
  <ul>
    <li v-for="item in letters" :key="item">{
  {item}}</li>
  </ul>
</div>

<script src="../../lib/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      letters: ['A', 'B', 'C', 'D', 'E']
    }
  })
</script>

</body>
</html>

4. 04-哪些数组的方法是响应式的.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>04-哪些数组的方法是响应式的</title>
</head>
<body>

<div id="app">
  <ul>
    <li v-for="item in letters">{
  {item}}</li>
  </ul>
  <button @click="btnClick">按钮</button>
</div>

<script src="../../lib/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      letters: ['a', 'b', 'c', 'd']
    },
    methods: {
      btnClick() {
        /*
        * push(), pop(), shift(), unshift(), splic(), sort(), reverse()
        * 以上都是响应式的 方法
        * Vue是响应式的,所以当数据发生变化时,Vue会自动检测数据变化,视图会发生对应的更新。
        * Vue中包含了一组观察数组编译的方法,使用它们改变数组也会触发视图的更新。
        * */
        /*
        * 1.push方法
        * */
        // this.letters.push('aaa')
        // this.letters.push('aaaa', 'bbbb', 'cccc')

        /*
        * 2.pop(): 删除数组中的最后一个元素
        * */
        // this.letters.pop();

        /*
        * 3.shift(): 删除数组中的第一个元素
        * */
        // this.letters.shift();

        /*
        * 4.unshift(): 在数组最前面添加元素
        * */
        // this.letters.unshift()
        // this.letters.unshift('aaa', 'bbb', 'ccc')

        /*
        * 5.splice作用: 删除元素/插入元素/替换元素
        *
        * 删除元素: 第二个参数传入你要删除几个元素(如果没有传,就删除后面所有的元素)
        * splice(1, num) 从第 1 个开始,删除num个数
        * splice(1)      删除 第1个以后的所有元素
        * 替换元素: 第二个参数, 表示我们要替换几个元素, 后面是用于替换前面的元素
        * splice(start, num, 。。。):从第start个开始,后面的 num 个元素,都被后面的参数都代替
        * 插入元素: 第二个参数, 传入0, 并且后面跟上要插入的元素
        * */
        // splice(start): // 删除
        this.letters.splice(1, 3, 'm', 'n', 'l', 'x')  // 替换
        // this.letters.splice(1, 0, 'x', 'y', 'z') // 添加

        /*
        * 5.sort()
        * */
        // this.letters.sort()

        /*
        * 6.reverse()
        * */
        // this.letters.reverse()

        // 注意: 通过索引值修改数组中的元素
        // this.letters[0] = 'bbbbbb';
        // this.letters.splice(0, 1, 'bbbbbb')
        // set(要修改的对象, 索引值, 修改后的值)
        // Vue.set(this.letters, 0, 'bbbbbb')
      }
    }
  })

  /*
  * ...num:可变参数,数组类型
  * */
  function sum(...num) {
    console.log(num);
  }

  sum(20, 30, 40, 50, 601, 111, 122, 33)

</script>

</body>
</html>

5. 05-作业的回顾和完成.html(同上一章:三.4)

点谁,谁变红。
和上一章中的三.4是一样的

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>05-作业的回顾和完成</title>
  <style>
    .active {
      color: red;
    }
  </style>
</head>
<body>

<div id="app">
  <ul>
    <li v-for="(item, index) in movies"
        :class="{active: currentIndex === index}"
        @click="liClick(index)">
      {
  {index}}.{
  {item}}
    </li>

    <!--<li :class="{active: 0===currentIndex}"></li>-->
    <!--<li :class="{active: 1===currentIndex}"></li>-->
    <!--<li :class="{active: 2===currentIndex}"></li>-->
    <!--<li :class="{active: 3===currentIndex}"></li>-->
  </ul>
</div>

<script src="../../lib/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      movies: ['海王', '海贼王', '加勒比海盗', '海尔兄弟'],
      currentIndex: 0
    },
    methods: {
      liClick(index) {
        this.currentIndex = index
      }
    }
  })
</script>

</body>
</html>

在这里插入图片描述

四、04-书籍购物车案例

1. index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>书籍购物车案例</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
<div id="app">
  <div v-if="books.length">
    <table>
      <thead>
      <tr>
        <th></th>
        <th>书籍名称</th>
        <th>出版日期</th>
        <th>价格</th>
        <th>购买数量</th>
        <th>操作</th>
      </tr>
      </thead>
      <tbody>
      <tr v-for="(item, index) in books">
        <td>{
  {item.id}}</td>
        <td>{
  {item.name}}</td>
        <td>{
  {item.date}}</td>
        <td>{
  {item.price | showPrice}}</td>
        <td>
          <button @click="decrement(index)" :disabled="item.count <= 1" >-</button>
          {
  {item.count}}
          <button @click="increment(index)">+</button>
        </td>
        <td><button @click="removeHandle(index)">移除</button></td>
      </tr>
      </tbody>
    </table>
    <h2>总价格: {
  {totalPrice | showPrice}}</h2>
  </div>
  <h2 v-else>购物车为空</h2>
</div>

<script src="../../lib/vue.js"></script>
<script src="main.js"></script>
</body>
</html>

2. main.js

const app = new Vue({
  el: '#app',
  data: {
    books: [
      {
        id: 1,
        name: '《算法导论》',
        date: '2006-9',
        price: 85.00,
        count: 1
      },
      {
        id: 2,
        name: '《UNIX编程艺术》',
        date: '2006-2',
        price: 59.00,
        count: 1
      },
      {
        id: 3,
        name: '《编程珠玑》',
        date: '2008-10',
        price: 39.00,
        count: 1
      },
      {
        id: 4,
        name: '《代码大全》',
        date: '2006-3',
        price: 128.00,
        count: 1
      },
    ]
  },
  computed: {
    totalPrice() {
      let totalPrice = 0
      for (let i = 0; i < this.books.length; i++) {
        totalPrice += this.books[i].price * this.books[i].count
      }
      return totalPrice

      // for (let i in/of this.books)
      // reduce
    }
  },
  methods: {
    decrement: function (index) {
      this.books[index].count--;
    },
    increment(index) {
      this.books[index].count++;
    },
    removeHandle(index) {
      this.books.splice(index, 1)
    }
  },
  filters: {
    showPrice(price) {
      return '¥' + price.toFixed(2)
    }
  }
})

3. style.css

table {
  border: 1px solid #e9e9e9;
  border-collapse: collapse;
  border-spacing: 0;
}

th, td {
  padding: 8px 16px;
  border: 1px solid #e9e9e9;
  text-align: left;
}

th {
  background-color: #f7f7f7;
  color: #5c6b77;
  font-weight: 600;
}

五、高阶函数.js

// filter / map/ reduce
const nums = [10, 20, 30, 40, 50, 60, 70, 80, 90]

let n =nums.filter(function (n) {
  return n < 100;
}).map(function (n) {
  return n*2;
}).reduce(function (preValue, n) {
  return preValue+n;
});
console.log(n);
let m = nums.filter(n=>n<100).map(n=>n*2).reduce((preValue, n)=>preValue+n);
console.log(m);

/*
* 需求1:取出所有小于100的数组
* */
// 解决方法1
let newNums = []
for (let i of nums){
  if (i<100){
    newNums.push(i)
  }
}
console.log(newNums);

// 解决方法2
let newNums1 = nums.filter(function (n) {
return n<100;
})
console.log(newNums1);

/*
* 需求2:将所有小于100的数字进行转化:全部 * 2
* */
let new2Nums = []
for (let i of newNums){
  new2Nums.push(i*2)
}
console.log(new2Nums);

let new2Nums1 = newNums.map(function (n) {
  return n*2;
})
console.log(new2Nums1);

/*
* 需求3:将所有的 new2nums 数字相加,得到最终的结果
* */
let total=0
for (let n of new2Nums){
  total+=n
}
console.log(total);

let total1 = new2Nums.reduce(function (preValue, book) {
  return preValue+ book
}, 0)
console.log(total1);
相关文章
|
3天前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
3天前
|
存储 缓存 JavaScript
在 Vue 中使用 computed 和 watch 时,性能问题探讨
本文探讨了在 Vue.js 中使用 computed 计算属性和 watch 监听器时可能遇到的性能问题,并提供了优化建议,帮助开发者提高应用性能。
|
3天前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
3天前
|
存储 缓存 JavaScript
Vue 中 computed 和 watch 的差异
Vue 中的 `computed` 和 `watch` 都用于处理数据变化,但使用场景不同。`computed` 用于计算属性,依赖于其他数据自动更新;`watch` 用于监听数据变化,执行异步或复杂操作。
|
2天前
|
JavaScript 前端开发 UED
vue学习第二章
欢迎来到我的博客!我是一名自学了2年半前端的大一学生,熟悉JavaScript与Vue,目前正在向全栈方向发展。如果你从我的博客中有所收获,欢迎关注我,我将持续更新更多优质文章。你的支持是我最大的动力!🎉🎉🎉
|
4天前
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
|
2天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,熟悉JavaScript与Vue,正向全栈方向发展。博客内容涵盖Vue基础、列表展示及计数器案例等,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
|
17天前
|
数据采集 监控 JavaScript
在 Vue 项目中使用预渲染技术
【10月更文挑战第23天】在 Vue 项目中使用预渲染技术是提升 SEO 效果的有效途径之一。通过选择合适的预渲染工具,正确配置和运行预渲染操作,结合其他 SEO 策略,可以实现更好的搜索引擎优化效果。同时,需要不断地监控和优化预渲染效果,以适应不断变化的搜索引擎环境和用户需求。
|
4天前
|
存储 JavaScript
Vue 组件间如何通信
Vue组件间通信是指在Vue应用中,不同组件之间传递数据和事件的方法。常用的方式有:props、自定义事件、$emit、$attrs、$refs、provide/inject、Vuex等。掌握这些方法可以实现父子组件、兄弟组件及跨级组件间的高效通信。
|
9天前
|
JavaScript
Vue基础知识总结 4:vue组件化开发
Vue基础知识总结 4:vue组件化开发