Hello vue

115 阅读3分钟

传统网页开发步骤

  • 编写HTML
    • 确定哪个Dom是需要进行交互的
  • 编写CSS
  • 编写JavaScript交互
    • 获取dom
    • 添加事件监听
    • 维护数据

在传统的方式中,如果我们需要对某个元素进行操作,那么需要用选择器获取对应的dom元素,然后再对dom元素进行操作。也就是dom操作比较繁琐。另外,js中的数据跟Dom元素中的展示的内容是分开的。需要将js中变量的值设置再dom元素的内容当中,才可以在页面中显示出来。也就是,数据和视图是分开的,是不同步的。 另外,HTML是静态的,如果多个页面有相同的结构,例如导航,底部,按钮等,需要在每个页面赋值代码; css是全局共享的,如果不小心使用了相同的“class”那么后定义的样式会把先定义的给覆盖掉了;JavaScript的全局变量也是共享的。引入多个JavaScript之后,如果使用了同名的变量,那也可能会造成污染。 html和JavaScript是紧密结合的,需要通过id等属性来获取dom实例,耦合性比较高。如果HTML有修改,那么相应的js代码可能也需要进行修改。

这些问题,在VUE中都能够得到解决。

VUE 的好处

VUE是渐进式的,也就是说,可以单独将某个元素或者某个部分,改造成使用vue的方式。

VUE通过模板语法,可以动态的显示数据,减少代码量。

数据可以交由VUE来管理,实现视图与数据的同步。

通过组件化的代码,可以复用HTML代码,组件之间是相互独立的。一个组件的数据发生变化,不会影响另一个组件的数据。避免了数据冲突的问题。

使用VUE单一组件特性,可以让CSS只针对本组件生效,

引用VUE

引入VUE的方式大体上有两种,一种是通过script标签的方式进行引入,可以引入本地的vue.js文件,也可以引用在线cdn的方式引入。

第二种是所以用脚手架,这个后面再讨论。

demo

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="style.css">
    <script src="lib/vue.global.js"></script>
</head>
<body>
    <div id="app">
        <h1>播放列表</h1>
        <input type="text" placeholder="请输入要查找的歌曲名" class="search" v-model="searchTerm"/>
        <ul>
          <li  v-for="song in filteredPlayList">{{song}}</li>
        </ul>
      </div>
    <script src="index.js"></script>
</body>
</html>

css

* {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
  font-family: Arial, "PingFang SC", "Microsoft Yahei", sans-serif;
}

body {
  background: #ebfafe;
  display: grid;
  place-items: center;
  height: 100vh;
}

#app {
  min-width: 375px;
  min-height: 500px;
  background: #ffffff;
  box-shadow: 0px 0px 48px rgba(0, 0, 0, 0.25);
  border-radius: 24px;
  padding: 28px;
}

#app h1 {
  font-size: 16px;
  color: #878b91;
  font-weight: 500;
}

.search {
  width: 100%;
  background: #f8f8f8;
  border: none;
  border-radius: 8px;
  padding: 10px;
  margin: 24px 0;
  font-size: 14px;
  outline: none;
}

.search::placeholder {
  color: #d5dbe3;
}

#app ul {
  color: #425066;
  list-style: none;
}

#app ul li {
  margin-bottom: 24px;
}

JavaScript

const PlayList = {

    data(){
        return {
            playlist:["第一首歌", "第二首歌", "第三首歌"],
            searchTerm: "",
        };
    },
    computed:{
        filteredPlayList(){
            if(this.searchTerm){
                return this.playlist.filter((song) =>
              song.toLowerCase().includes(this.searchTerm.toLowerCase())
            );
            }else{
                return this.playlist;
            }
        }
    }
};


Vue.createApp(PlayList).mount("#app");