fetch
javascript
XMLHttpRequest是一个设计粗糙的API, 配置和调用方式很是混乱,并且基于事件的异步模型写起来不友好,兼容性很差.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Examples</title> <meta name="description" content=""> <meta name="keywords" content=""> <link href="" rel="stylesheet"> <script type="text/javascript" src="lib/vue.js"></script> </head> <body> <div id="box"> <button @click="handleClick()">获取影片信息</button> <ul> <li v-for="data in datalist"> <h3>{{ data.name }}</h3> <img :src="data.poster"> </li> </ul> </div> <script> new Vue({ el: "#box", data: { datalist: [] }, methods: { handleClick() { fetch("./json/test.json").then(res => res.json()).then(res => { console.log(res.data.films) this.datalist = res.data.films }) } } }) </script> <!-- new Vue({ el: "#box", data:{ datalist:["111","222","333"] } }) --> </body> </html>
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Examples</title> <meta name="description" content=""> <meta name="keywords" content=""> <link href="" rel="stylesheet"> <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> <script type="text/javascript" src="lib/vue.js"></script> </head> <body> <div id="box"> <button @click="handleClick()">正在热映</button> <ul> <li v-for="data in datalist"> <h1>{{ data.name }}</h1> <img :src="data.poster"> </li> </ul> </div> <script> new Vue({ el: "#box", data: { datalist: [] }, methods: { handleClick() { axios.get("./json/test.json").then(res => { // axios 自欧东包装data属性 res.data console.log(res.data.data.films) this.datalist = res.data.data.films }).catch(err => { console.log(err); }) } } }) </script> </body> </html>
/* 复杂逻辑,模板难以维护 1. 基础例子 2. 计算缓存 VS methods - 计算属性是基于他们的依赖进行缓存的. - 计算属性只有在他的相关依赖发生改变时才会从新求值 3. 计算属性VS watch - v-model */
Example1
vue
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Examples</title> <meta name="description" content=""> <meta name="keywords" content=""> <link href="" rel="stylesheet"> <script type="text/javascript" src="lib/vue.js"></script> </head> <body> <div id="box"> <!-- 截取myname字符串将首字母大写,不推荐,请看下面 --> {{ myname.substring(0,1).toUpperCase() + myname.substring(1) }} <!-- 不要加(),不然就是函数 --> <p>计算属性:{{ getMyName }}</p> <p>普通方法:{{ getMyNameMethod() }}</p> <div> 也须要计算结果 <p>计算属性:{{ getMyName }}</p> <!-- 计算属性能够让一个页面多个地方调用一个计算结果只调用一次,而方法屡次调用会屡次执行 --> <!-- 1. 依赖的状态改变了, 计算属性会从新计算一遍 2. 计算属性会缓存 --> <p>普通方法:{{ getMyNameMethod() }}</p> </div> </div> <script> vm = new Vue({ el: "#box", data: { myname: "xiaoming" }, methods:{ getMyNameMethod(){ console.log("getMyNameMethos-方法调用") return this.myname.substring(0,1).toUpperCase() + this.myname.substring(1) } }, computed:{ getMyName(){ console.log("getMyName-计算属性调用") return this.myname.substring(0,1).toUpperCase() + this.myname.substring(1) } } }) </script> </body> </html>
Example2
java
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Examples</title> <meta name="description" content=""> <meta name="keywords" content=""> <link href="" rel="stylesheet"> <script type="text/javascript" src="lib/vue.js"></script> </head> <body> <div id="box"> <input type="text" v-model="mytext" /> <!-- <input type="text" @input="handleInput()" v-model="mytext" /> --> <ul> <li v-for="data in getMyDatalist"> {{ data }} </li> </ul> </div> <script type="text/javascript"> var vm = new Vue({ el: "#box", data: { mytext: "", datalist: ["aaa", "bbb", "ccc", "ddd", "eee", ], }, computed: { getMyDatalist() { return this.datalist.filter(item => item.indexOf(this.mytext) > -1) } }, }) </script> </body> </html>
组件(Component)是 Vue.js 最强大的功能之一。ios
组件能够扩展 HTML 元素,封装可重用的代码。chrome
组件系统让咱们能够用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面均可以抽象为一个组件树:npm
全部实例都能使用全局组件
json
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Examples</title> <meta name="description" content=""> <meta name="keywords" content=""> <link href="" rel="stylesheet"> <script type="text/javascript" src="lib/vue.js"></script> <style> .navbar{ background: red; } </style> </head> <body> <div id="box"> <navbar></navbar> <navbar></navbar> </div> <script type="text/javascript"> // 1. 全局定义组件(做用域隔离) Vue.component("navbar", { template: ` <div style="background:yellow"> <button @click="handleback()">返回</button> navbar <button>主页</button> </div>`, methods: { handleback() { console.log("back") } } }) new Vue({ el: "#box" }) </script> </body> </html>
咱们能够在实力选项中注册局部组件,这样组件只能在这个实例中使用
axios
Example1
缓存
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Examples</title> <meta name="description" content=""> <meta name="keywords" content=""> <link href="" rel="stylesheet"> <script type="text/javascript" src="lib/vue.js"></script> <style> .navbar{ background: red; } </style> </head> <body> <div id="box"> <navbar></navbar> <navbar></navbar> <sidebar></sidebar> </div> <script type="text/javascript"> // 1. 全局定义组件(做用域隔离) Vue.component("navbar", { template: ` <div style="background:yellow"> <button @click="handleback()">返回</button> navbar <button>主页</button> <child></child> <navbarchild></navbarchild> </div>`, methods: { handleback() { console.log("back") } }, // 局部定义组件 components: { navbarchild: { template: ` <div> navbarchild-只能在navbar组件中使用 </div> ` } } }) Vue.component("child", { template: `<div>child组件-全局定义</div>` }) Vue.component("sidebar", { template: ` <div> sider组件 <child></child> </div> ` }) new Vue({ el: "#box" }) // root component </script> </body> </html>
/* 1. 自定义组件须要有一个root element 2. 父子组件的data是没法共享的 3. 组件能够有data,methods,computed.., 可是data必须是一个函数 */