聚合数据【点击进入】
进行注册、实名制认证后
搜索"新闻头条"【点击进入】
申请后获得一个key值
接口地址:http://v.juhe.cn/toutiao/index
返回格式:json
请求方式:get/post
请求示例:http://v.juhe.cn/toutiao/index?type=top&key=APPKEY
接口备注:返回头条,社会,国内,娱乐,体育,军事,科技,财经,时尚等新闻信息
名称 | 必填 | 类型 | 说明 |
---|---|---|---|
key | 是 | string | 应用APPKEY |
type | 否 | string | 类型,shehui(社会),guonei(国内),guoji(国际),yule(娱乐),tiyu(体育)junshi(军事),keji(科技),caijing(财经),shishang(时尚) |
{
"reason": "成功的返回",
"result": {
"stat": "1",
"data": [{
"uniquekey": "6c4caa0c3ba6e05e2a272892af43c00e",
"title": "杨幂的发际线再也回不去了么?网友吐槽像半秃",
"date": "2017-01-05 11:03",
"category": "yule",
"author_name": "腾讯娱乐",
"url": "http://mini.eastday.com/mobile/170105110355287.html?qid=juheshuju",
/*新闻链接,暂支持手机端浏览器访问*/
"thumbnail_pic_s": "http://03.imgmini.eastday.com/mobile/20170105/20170105110355_
806 f4ed3fe71d04fa452783d6736a02b_1_mwpm_03200403.jpeg ",
"thumbnail_pic_s02": "http://03.imgmini.eastday.com/mobile/20170105/20170105110355_
806 f4ed3fe71d04fa452783d6736a02b_2_mwpm_03200403.jpeg ",
"thumbnail_pic_s03": "http://03.imgmini.eastday.com/mobile/20170105/20170105110355_
806 f4ed3fe71d04fa452783d6736a02b_3_mwpm_03200403.jpeg "
},
...
]
}
}
vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目
下面介绍 vue-cli 的整个搭建过程
注意:以下内容是基于Vue-cli4.0以上版本的。
NPM(node package manager)是随同node.js一起安装的包管理工具,能解决前端代码部署上的很多问题,常见的使用场景有以下几种:
实际上,npm就是前端的Maven
从node官网下载并安装node,安装步骤很简单,只要一路next就可以了。 安装完成后,打开命令行工具输入命令node -v,如下图,如果出现对应版本号,就说明安装成功了
C:\Users\Administrator>node -v
v10.16.0
我们所需要的npm也已经安装好了,输入如下命令,显示出npm的版本信息
C:\Users\Administrator>npm -v
6.9.0
到这里node的环境已经安装完了,npm包管理工具也有了,但是由于npm的有些资源被墙,为了更快更稳定,所以我们需要切换到淘宝的npm镜像——cnpm
点击进入淘宝的cnpm网站,里面有详细的配置方法。 或者直接在命令行输入:
npm install -g cnpm --registry=https://registry.npm.taobao.org
然后等待,安装完成。 输入cnpm -v,可以查看当前cnpm版本,这个和npm的版本还是不一样的
C:\Users\Administrator>cnpm -v
[email protected]
使用cnpm的方法就是,需要用到npm的地方直接使用cnpm替换就可以了
全局安装vuecli(就相当与在本机的npm仓库中有了vuecli):
//安装最新@vue/cli版本
npm install -g @vue/cli
//安装指定的@vue/cli版本
npm install -g @vue/[email protected]
安装完成后,使用 vue -V 显示版本号来测试vue是否安装成功
C:\Users\Administrator>vue -V
@vue/cli 4.1.1
示例中文件夹在D盘根目录,项目名为 csdn_topnews
(全部小写)
vue create csdn_topnews
Manually select features
(手动选择特征)通过 ↑↓ 箭头选择依赖,按 “空格” 选中,按 “a” 全选,按 “i” 反选
Babel
、Router
、Vuex
即可
Babel:转码器,可以将ES6代码转为ES5代码,可兼容不支持ES6的浏览器
TypeScript:是JavaScript的超集(.ts文件),包含并扩展了 JavaScript 的语法。需要被编译输出为 JavaScript在浏览器运行
Progressive Web App (PWA) Support:渐进式Web应用程序
Router :vue-router(vue路由)
Vuex :vuex(vue的状态管理模式)
CSS Pre-processors :CSS 预处理器(如:less、sass)
Linter / Formatter:代码风格检查和格式化(如:ESlint)
Unit Testing :单元测试(unit tests)
E2E Testing :e2e(end to end) 测试
选择是否使用 history 形式的路由,也就是询问路径是否带 # 号,这里选择 n
询问将依赖文件放在独立文件中,还是 package.json 中,为了保持工程配置文件的整洁性,这里选择 In package.json
等待安装,最后出现如下图即可
在实际开发中,使用一些封装好的ajax框架,这里选用axios框架
原因是:Vue官方推荐使用 axios 框架
axios框架中文官网:http://www.axios-js.com/
###(2)项目中安装 axios
cd csdn_topnews
cnpm install axios --save
cnpm install qs --save
由于申请的 API 不允许跨域访问,只允许代码内访问,需要加一个代理配置文件
文件名为 vue.config.js
module.exports = {
devServer: {
port: 8080,
proxy: {
'/juheNews': {
target: 'http://v.juhe.cn/', //需要跨域的url
ws: true, //代理webSocket
changeOrigin: true, //允许跨域
pathRewrite: {
'^/juheNews': '' //重写路径
}
}
}
}
}
将文件复制到项目根目录下即可
在 cmd 项目目录中输入运行命令
npm run serve
等待加载,如图所示
复制给出的地址,在浏览器中打开,这里为 http://localhost:8080/
直接拖拽文件夹或手动导入即可
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ermo728-1615626529265)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1612856664274.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_5aW25aaI44Gu5rC05Y2w,size_12,color_FFCD42,t_100)]
修改 csdn_topnews\src\main.js
文件
添加语句
import axios from 'axios'
import qs from 'qs' // 只在发送post请求时用到
Vue.prototype.$axios = axios;
Vue.prototype.$qs = qs; // 只在发送post请求时用到
清空新建项目时自带的参考模板代码
删除主页面:csdn_topnews\src\components\HelloWorld.vue
删除子组件:csdn_topnews\src\views\About.vue
和 Home.vue
修改主页面 csdn_topnews\src\App.vue
保留路由出口
,使用路由切换新闻页面
删除初始模板的代码和样式
!!!删除下列代码
!!!删除下列样式
#app{
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
}
#nav {
padding: 30px;
}
#nav a {
font-weight: bold;
color: #2c3e50;
}
#nav a.router-link-exact-active {
color: #42b983;
}
修改路由文件 csdn_topnews\src\router\index.js
删除引包中的 Home.vue
!!!删除下列引入
import Home from '../views/Home.vue'
重置 routes
变量,将一组路径注释掉作为模板之后使用
const routes = [
/*
{
path: '/',
name: 'Home',
component: Home
},
*/
]
编写头部导航标签页面 csdn_topnews\src\App.vue
部分
介绍template 的作用是模板占位符,可以包裹元素,循环过程中,template 不会被渲染到页面上
内容要求具体介绍:vue 中 template 的作用及使用【点击进入】 在一个文档中,可以定义多个 注释: 并不是所有的 HTML 文档都要使用到 在不同设备上(手机或者PC)可以制定导航链接是否显示,以适应不同屏幕的需求 菜鸟教程:Vue.js 样式绑定【点击进入】 class 与 style 是 HTML 元素的属性,用于设置元素的样式,可以用 v-bind 来设置样式属性 Vue.js v-bind 在处理 class 和 style 时,表达式的结果类型除了字符串之外,还可以是对象或数组 其中, 菜鸟教程:Vue.js 事件处理器【点击进入】 事件监听可以使用 v-on 指令 通常需要使用一个方法来调用 JavaScript 方法,v-on 可以接收一个定义的方法来调用 ,也可以用内联 JavaScript 语句 v-on 可以接收一个定义的方法来调用 在 methods 对象中定义方法 菜鸟教程:Vue.js 组件(略)【点击进入】 菜鸟教程:Vue.js 组件 - 自定义事件【点击进入】 父组件是使用 props 传递数据给子组件 如果子组件要把数据传递回去,就需要使用自定义事件 可以使用 v-on 绑定自定义事件, 每个 Vue 实例都实现了事件接口 (Events interface),即: 父组件可以在使用子组件的地方直接用 v-on 来监听子组件触发的事件 以下实例中子组件和它外部完全解耦,实现它触发一个父组件关心的内部事件 App.vue 中的 nav:导航栏,负责导航栏横条样式 navinit:被选中的新闻种类选项块的 class 样式,包括字体边红、下方出现红色横线 isActive:App.vue 的 data 中的字符串变量,可更改为 ‘topNews’(默认) 或 ‘typeNews’ changeNav(param):App.vue 的 methods 中的方法,param 意为 “参数”,功能有两点 将 即 菜鸟教程:CSS3 弹性盒子(Flex Box)【点击进入】 弹性盒子是 CSS3 的一种新的布局模式 是一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有恰当的行为的布局方式 引入弹性盒布局模型的目的是提供一种更加有效的方式来对一个容器中的子元素进行排列、对齐和分配空白空间 弹性盒子由弹性容器 (Flex container) 和弹性子元素 (Flex item) 组成 弹性容器通过设置 display 属性的值为 flex 或 inline-flex 将其定义为弹性容器 弹性容器内包含了一个或多个弹性子元素 **注意:**弹性容器外及弹性子元素内是正常渲染的。弹性盒子只定义了弹性子元素如何在弹性容器内布局 弹性子元素默认在弹性盒子内一行显示,从左到右,默认情况每个容器只有一行 菜鸟教程:CSS3 弹性盒子(Flex Box)【点击进入】 内容对齐(justify-content)属性应用在弹性容器上,把弹性项沿着弹性容器的主轴线(main axis)对齐 flex-start: 弹性项目向行头紧挨着填充。这个是默认值。第一个弹性项的main-start外边距边线被放置在该行的main-start边线,而后续弹性项依次平齐摆放。 flex-end: 弹性项目向行尾紧挨着填充。第一个弹性项的main-end外边距边线被放置在该行的main-end边线,而后续弹性项依次平齐摆放 center: 弹性项目居中紧挨着填充。(如果剩余的自由空间是负的,则弹性项目将在两个方向上同时溢出) space-between: 弹性项目平均分布在该行上。如果剩余空间为负或者只有一个弹性项,则该值等同于flex-start。否则,第1个弹性项的外边距和行的main-start边线对齐,而最后1个弹性项的外边距和行的main-end边线对齐,然后剩余的弹性项分布在该行上,相邻项目的间隔相等 space-around: 弹性项目平均分布在该行上,两边留有一半的间隔空间。如果剩余空间为负或者只有一个弹性项,则该值等同于center。否则,弹性项目沿该行分布,且彼此间隔相等(比如是20px),同时首尾两边和弹性容器之间留有一半的间隔(1/2*20px=10px) 菜鸟教程:CSS3 弹性盒子(Flex Box)【点击进入】 菜鸟教程:CSS letter-spacing 属性【点击进入】 letter-spacing 属性增加或减少字符间的空白(字符间距) normal: 默认,规定字符间没有额外的空间 length : 定义字符间的固定空间(允许使用负值) inherit : 规定应该从父元素继承 letter-spacing 属性的值 导航栏整体样式 当 解决方法:在 导航栏选项文字样式 带背景颜色区分效果 实际效果 可将其中一个的样式绑定的判断条件设为 true,如: 保存后刷新即可,被选中是文字颜色变红,并且下方有红色横线 菜鸟教程:ES6 模块【点击进入】 ES6 引入了模块化,其设计思想是在编译时就能确定模块的依赖关系,以及输入和输出的变量 ES6 的模块化分为导出(export) @与导入(import)两个模块 ES6 的模块自动开启严格模式,不管你有没有在模块头部加上 模块中可以导入和导出各种类型的变量,如函数,对象,字符串,数字,布尔值,类等 每个模块都有自己的上下文,每一个模块内声明的变量都是局部变量,不会污染全局作用域 每一个模块只加载一次(是单例的), 若再去加载同目录下同文件,直接从内存中读取 菜鸟教程:ES6 模块【点击进入】 基本用法:模块导入导出各种类型的变量,如字符串,数值,函数,类 模块导入导出各种类型的变量,如字符串,数值,函数,类。 建议使用大括号指定所要输出的一组变量写在文档尾部,明确导出的接口 函数与类都需要有对应的名称,导出文档尾部也避免了无对应名称 export 命令导出的接口名称,须和模块内部的变量有一一对应关系 导入的变量名,须和导出的接口名称相同,即顺序可以不一致 不同模块导出接口名称命名重复, 使用 as 重新定义变量名 不允许在加载模块的脚本里面,改写接口的引用指向 即不能改写 import 变量类型为基本类型的值,但可以改写 import 变量类型为对象的属性值 多次重复执行同一句 import 语句,那么只会执行一次,而不会执行多次 import 同一模块,声明不同接口引用,会声明对应变量,但只执行一次 import import 是静态执行,所以不能使用表达式和变量 相关CSDN博客:vue.js 中 created 方法的使用详解【点击进入】 一个 vue 实例被生成后还要绑定到某个 html 元素上,之后还要进行编译,然后再插入到 document 中 每一个阶段都有一个钩子函数,方便开发者在不同阶段处理不同逻辑 一般可以在 created 函数中调用 ajax 获取页面初始化所需的数据 菜鸟教程:JavaScript let 和 const【点击进入】 ES6 新增加了两个重要的 JavaScript 关键字:let 和 const let 声明的变量只在 let 命令所在的代码块内有效 const 声明一个只读的常量,一旦声明,常量的值就不能改变。 在 ES6 之前,JavaScript 只有两种作用域:全局变量 与 函数内的局部变量 在函数外声明的变量作用域是全局的 全局变量在 JavaScript 程序的任何地方都可以访问 在函数内声明的变量作用域是局部的(函数内) 函数内使用 var 声明的变量只能在函数内容访问,如果不使用 var 则是全局变量 使用 var 关键字声明的变量不具备块级作用域的特性,它在 在 ES6 之前,是没有块级作用域的概念的。 ES6 可以使用 let 关键字来实现块级作用域。 let 声明的变量只在 let 命令所在的代码块 使用 var 关键字重新声明变量可能会带来问题 在块中重新声明变量也会重新声明块外的变量 let 关键字可以解决这个问题,它只在 let 命令所在的代码块 使用 var 关键字,它声明的变量是全局的,包括循环体内与循环体外 使用 let 关键字, 它声明的变量作用域只在循环体内,循环体外的变量不受影响 在 JavaScript 中, 全局作用域是针对 JavaScript 环境 在 HTML 中, 全局作用域是针对 window 对象 使用 var 关键字声明的全局作用域变量属于 window 对象 使用 let 关键字声明的全局作用域变量不属于 window 对象 使用 var 关键字声明的变量在任何地方都可以修改 在相同的作用域或块级作用域中,不能使用 let 关键字来重置 var 关键字声明的变量 在相同的作用域或块级作用域中,不能使用 let 关键字来重置 let 关键字声明的变量 在相同的作用域或块级作用域中,不能使用 var 关键字来重置 let 关键字声明的变量 let 关键字在不同作用域,或不同块级作用域中是可以重新声明赋值的 菜鸟教程:JavaScript 变量提升【点击进入】 JavaScript 中,var 关键字定义的变量可以在使用后声明,即变量可以先使用再声明 let 关键字定义的变量则不可以在使用后声明,也就是变量需要先声明再使用 const 用于声明一个或多个常量,声明时必须进行初始化,且初始化后值不可再修改 两者还有以下两点区别: const 声明的常量必须初始化 const 定义的变量并非常量,并非不可变,它定义了一个常量引用一个值 使用 const 定义的对象或者数组,是可变的 但是不能对常量对象重新赋值 但是不能对常量数组重新赋值 在相同的作用域或块级作用域中,不能使用 const 关键字来重置 var 和 let 关键字声明的变量 在相同的作用域或块级作用域中,不能使用 const 关键字来重置 const 关键字声明的变量 const 关键字在不同作用域,或不同块级作用域中是可以重新声明赋值的 const 关键字定义的变量则不可以在使用后声明,即变量需要先声明再使用 菜鸟教程:Location 对象【点击进入】 Location 对象包含有关当前 URL 的信息 Location 对象是 window 对象的一部分,可通过 window.Location 属性对其进行访问 注意:没有应用于 Location 对象的公开标准,不过所有浏览器都支持该对象 使用语法:均为字符串变量,如 使用语法:如 window.location.assign(url) : 加载 URL 指定的新的 HTML 文档,就相当于一个链接,跳转到指定的url,当前页面会转为新页面内容,可以点击后退返回上一个页面 window.location.replace(url) : 通过加载 URL 指定的文档来替换当前文档,这个方法是替换当前窗口页面,前后两个页面共用一个窗口,所以是没有后退返回上一页的 菜鸟教程:JavaScript String 对象【点击进入】 String 对象用于处理文本(字符串) String 对象创建方法: HTML 返回包含在相对应的 HTML 标签中的内容 以下方法并非标准方法,所以可能在某些浏览器下不支持 菜鸟教程:Vue.js 路由【点击进入】 Vue.js 路由允许我们通过不同的 URL 访问不同的内容 通过 Vue.js 可以实现多视图的单页Web应用(single page web application,SPA) Vue.js 路由需要载入 vue-router 库 中文文档地址:vue-router文档 直接下载 / CDN https://unpkg.com/vue-router/dist/vue-router.js NPM 推荐使用淘宝镜像: cnpm install vue-router Vue.js + vue-router 可以很简单的实现单页应用。 以下实例中将 vue-router 加进来,配置组件和路由映射,再设置 vue-router 在哪里渲染 点击过的导航链接都会加上样式 表示目标路由的链接 当被点击后,内部会立刻把 to 的值传到 router.push() 所以这个值可以是一个字符串或者是描述目标位置的对象 设置 replace 属性后,当点击时会调用 router.replace() 而不是 router.push() 导航后不会留下 history 记录 设置 append 属性后,则在当前 (相对) 路径前添加其路径 例:从 /a 导航到一个相对路径 b,如果没有配置 append,则路径为 /b,如果配置则为 /a/b 有时候想要 使用 设置 可以通过以下代码来替代 注意:这里 class 使用 active-class="_active"
配置当链接被精确匹配的时候应该激活的 class 可以通过以下代码来替代
声明可以用来触发导航的事件 可以是一个字符串或是一个包含字符串的数组 例:设置了 event 为 mouseover ,及在鼠标移动到 Router Link 1 上时导航的 HTML 内容会发生改变 App.vue 中的 export default { }:可从 App.vue 模块导出的 vue 数据,即 .js 文件可以导入 (import) 的数据 isActive:App.vue 的 data 中的字符串变量,可更改为 ‘topNews’(默认) 或 ‘typeNews’ created( ) { }:vue.js 的一个生命周期钩子函数 path:通过 location.href 获取存储当前文档的完整的 URL route:获取 path 的尾部地址,即最后一个 changeNav(param) { }:调用方法将 isActive 变量和路由地址根据传参 param 更改 this.$router.push( ):相当于 在 \src\views 中新建 vue 文件,命名为 TopNews.vue 在 \src\views 中新建 vue 文件,命名为 TypeNews.vue 编写 \src\router\index.js 文件 TopNews、TypeNews:用于引用两个 vue 文件的变量 import 命令要提升到整个模块的头部,首先执行 Vue.use(VueRouter):使用模块化机制编程,导入 Vue 和 VueRouter routes: 一组路由,把下面的每一条路由组合起来,形成一个数组 命名路由: 给路由加一个 name 属性 命名路由的使用,在router-link 中 to 属性就可以使用对象 在项目所在根目录运行 cmd,输入 npm run serve 运行 等待加载,运行成功后显示如下信息 在浏览器输入提示的 Local 地址即可访问 “头条新闻”和“分类新闻“中都包含了新闻列表,应使用组件,效果如下所示 菜鸟教程:Vue.js 组件【点击进入】 组件(Component)是 Vue.js 最强大的功能之一 组件可以扩展 HTML 元素,封装可重用的代码 注册一个全局组件语法格式如下: tagName 为组件名,options 为配置选项 注册后,可以使用以下方式来调用组件: prop 是子组件用来接受父组件传递过来的数据的一个自定义属性 父组件的数据需要通过 props 把数据传给子组件 子组件需要显式地用 props 选项声明 “prop” 类似于用 v-bind 绑定 HTML 特性到一个表达式 也可以用 v-bind 动态绑定 props 的值到父组件的数据中 每当父组件的数据变化时,该变化也会传导给子组件 以下实例中使用 v-bind 指令将 todo 传到每一个重复的组件中 其中 todo 为自定义变量 prop 是单向绑定的,当父组件的属性变化时,将传导给子组件,但是不会反过来 组件可以为 props 指定验证要求 为了定制 prop 的验证方式,可以为 props 中的值提供一个带有验证需求的对象,而不是一个字符串数组 当 prop 验证失败的时候,(开发环境构建版本的) Vue 将会产生一个控制台的警告 type 可以是以下原生构造器: type 也可以是一个自定义构造器,使用 instanceof 检测 Vue.js 允许你自定义过滤器,被用作一些常见的文本格式化 由“管道符”指示,格式如下: 过滤器函数接受表达式的值作为第一个参数 过滤器可以串联: 过滤器是 JavaScript 函数,因此可以接受参数: message 是第一个参数,字符串 ‘arg1’ 将传给过滤器作为第二个参数, arg2 表达式的值将被求值然后传给过滤器作为第三个参数 例:对输入的字符串第一个字母转为大写 编写新闻列表模板组件 {{item.author_name}} {{item.date}} data:子组件传给父组件(即 NewList.vue)的值(prop),具体的值为从 API 接口返回的 JSON 数据中的 data 键值对数组(可参考返回示例) @click:v-on:click 的缩写 toNews(url):NewList.vue 中的方法(method),用于跳转至新闻详情页 item.url:API 接口返回的 JSON 数据中 data 内的 “'url” 项值(可参考返回示例),存放单条新闻的详情页的链接 class=“img-box”:列表行左侧的新闻图片部分 item.thumbnail_pic_s:API 接口返回的 JSON 数据中 data 内的 “'thumbnail_pic_s” 项值(可参考返回示例),存放单条新闻的标题缩略图 class=“text-box”:列表行右侧的新闻标题文本部分 item.title:API 接口返回的 JSON 数据中 data 内的 “'title” 项值(可参考返回示例),存放单条新闻的标题文本 {{item.title | titleFilter}}:相当于 titleFilter(item.title) 且返回值为过滤后的 item.title titleFilter(value):过滤器,功能为长度大于 24 时,将后面的文本省略为 ‘…’ data:子组件传给父组件(即 NewList.vue)的值(prop),具体的值为从 API 接口返回的 JSON 数据中的 data 键值对数组(可参考返回示例) toNews(url):NewList.vue 中的方法(method),用于跳转至新闻详情页 substr(start,length):在字符串中抽取从 start 下标开始的指定 length 个字符 scoped:布尔属性, 使用该属性,则样式仅仅应用到 style 元素的父元素及其子元素 【菜鸟教程】 box-sizing:属性允许以某种方式定义某些元素,以适应指定区域【菜鸟教程】 语法: content-box:指定元素的宽度和高度(最小/最大属性)适用于box的宽度和高度,元素的填充和边框布局和绘制指定宽度和高度除外 border-box:指定宽度和高度(最小/最大属性)确定元素边框,即对元素指定宽度和高度包括了 padding 和 border,通过从已设定的宽度和高度分别减去边框和内边距才能得到内容的宽度和高度 inherit:指定 box-sizing 属性的值,从父元素继承 dashed:虚线,可应用于边框样式 border-style、文本修饰线样式 text-decoration-style 等线条样式中【菜鸟教程】 user-select: 属性控制用户能否选中文本【html中文网】 语法: none:文本不能被选择 text: 可以选择文本 all:当所有内容作为一个整体时可以被选择。如果双击或者在上下文上点击子元素,那么被选择的部分将是以该子元素向上回溯的最高祖先元素 element:可以选择文本,但选择范围受元素边界的约束 cursor:属性定义了鼠标指针放在一个元素边界范围内时所用的光标形状【菜鸟教程】 flex:属性用于设置或检索弹性盒模型对象的子元素如何分配空间【菜鸟教程】 flex 属性是 flex-grow、flex-shrink、flex-basis 属性的简写属性,如果元素不是弹性盒模型对象的子元素,则 flex 属性不起作用 语法: flex-grow:一个数字,规定项目将相对于其他灵活的项目进行扩展的量 flex-shrink:一个数字,规定项目将相对于其他灵活的项目进行收缩的量 flex-basis:项目的长度,合法值:“auto”、“inherit” 或一个后跟 “%”、“px”、“em” 或任何其他长度单位的数字 auto:与 1 1 auto 相同 none:与 0 0 auto 相同。 initial:设置该属性为它的默认值,即为 0 1 auto inherit:从父元素继承该属性 菜鸟教程:Vue.js Ajax(axios)【点击进入】 Vue.js 2.0 版本推荐使用 axios 来完成 ajax 请求 Axios 是一个基于 Promise 的 HTTP 库,可以用在浏览器和 node.js 中 跨域指浏览器不能执行其他网站的脚本,未配置代理情况下以下代码仅可在菜鸟教程编辑器中成功运行 案例地址为 案例地址为 可以通过向 axios 传递相关配置来创建请求 菜鸟教程:JavaScript 函数定义【点击进入】 ES6 新增了箭头函数,箭头函数表达式的语法比普通函数表达式更简洁 当只有一个参数时,圆括号是可选的 没有参数的函数应该写成一对圆括号 有的箭头函数都没有自己的 this。 不适合定义一个对象的方法 当使用箭头函数的时,箭头函数会默认绑定外层 this 的值,所以在箭头函数中 this 的值和外层的 this 是一样的 箭头函数是不能提升的,所以需要在使用之前定义 使用 const 比使用 var 更安全,因为函数表达式始终是一个常量 如果函数部分只是一个语句,则可以省略 return 关键字和大括号 {},这样做是一个比较好的习惯箭头函数表达式的语法比普通函数表达式更简洁 编写头条新闻部分 NewList:列表组件模板,需要在 :data=“newsList”:参数 newsList 从 API 中获取,从 data() 方法中返回,形式为 JSON 数据 import NewsList from ‘…/components/NewsList’:引入组件文件(省略 newsList[] = response.data.reult.data:根据 API 接口返回的数据提取 data(可参考返回示例) 由于头条新闻也仅由头部图片和新闻列表组成,新闻列表部分的 CSS 样式已在模板组件 ###【截图12 TopNews.vue 完成】 isAlive:用于判断分类按钮的样式,默认为 news:从 newList[] 中随机抽取一条存入 news,用于头部新闻图片 Math.floor():返回不大于的最大整数 Math.random(): 返回介于 0(包含)~ 1(不包含)之间的一个随机数 change(id):更改 data 中的 isAlive 值实现按钮样式变换,并且更换获取 API 数据时的 type 值实现新闻列表内容更改 默认打开页 / "头条新闻"页 / 下滑效果 "分类新闻"页 / 分类按钮切换 / 点击进入新闻 {id: ‘caijing’,name: ‘财经’}, 默认打开页 / "头条新闻"页 / 下滑效果 "分类新闻"页 / 分类按钮切换 / 点击进入新闻 标签中内容必须被一个大
(2)
介绍
标签定义文档或者文档的一部分区域的页眉
元素应该作为介绍内容或者导航链接栏的容器
元素
标签不能被放在 、
或者另一个
元素内部
(3)
介绍
标签定义导航链接的部分
元素,
元素只是作为标注一个导航链接的区域
(4)v-bind 样式绑定 介绍
v-bind:class
可以简写为 :class
(5)v-on 事件处理器 介绍
(6)v-on 自定义事件 介绍
$on(eventName)
监听事件$emit(eventName)
触发事件
代码编写
块代码
部分
代码编写
(1)清空默认样式
html,body,div,header,nav,h1,h2,h3,h4,h5,h6,ul,li {
margin: 0;
padding: 0;
font-family: "微软雅黑";
}
注意:padding 对
影响
的 padding 属性设为 0 时,
的左侧列表圆点会取消
li {padding: 0;}
相当于 li {list-style: none;}
(2)设置
样式header {
width: 100%;
height: 48px;
background-color: #E03D3E;
display: flex;
justify-content: center; /*弹性容器内容居中*/
align-items: center; /*弹性容器纵向对齐*/
font-size: 20px;
color: #fff;
letter-spacing: 4px; /*设置字间距*/
}
1. display: flex 属性 介绍
2. justify-content 属性 介绍
justify-content: flex-start | flex-end | center | space-between | space-around
3. align-items 属性 介绍
align-items
设置或检索弹性盒子元素在侧轴(纵轴)方向上的对齐方式align-items: flex-start | flex-end | center | baseline | stretch
弹性盒子元素的侧轴(纵轴)起始位置的边界紧靠住该行的侧轴起始边界
弹性盒子元素的侧轴(纵轴)起始位置的边界紧靠住该行的侧轴结束边界
弹性盒子元素在该行的侧轴(纵轴)上居中放置(如果该行的尺寸小于弹性盒子元素的尺寸,则会向两个方向溢出相同的长度)
如弹性盒子元素的行内轴与侧轴为同一条,则该值与 ‘flex-start’ 等效。其它情况下,该值将参与基线对齐
如果指定侧轴大小的属性值为 ‘auto’,则其值会使项目的边距盒的尺寸尽可能接近所在行的尺寸,但同时会遵照 ‘min/max-width/height’ 属性的限制
4. letter-spacing 属性 介绍
样式效果
(3)设置
样式
nav {
width: 100%;
height: 56px;
display: flex;
justify-content: center;
align-items: center;
}
注意:
的 flex 对
影响
为 flex,而
不是 flex 时,
的左侧圆点还是会溢出显示出来
继续设置子弹性盒子,或直接设置
为
list-style: none;
(4)设置 nav ul li 样式
nav ul {
width: 160px;
height: 26px;
display: flex;
justify-content: space-between;
}
nav ul li {
width: 70px;
height: 26px;
display: flex;
justify-content: center;
align-items: center;
}
(5)设置被选中标签样式 navinit
.navinit {
color: #E03D3E;
border-bottom: solid 2px #E03D3E;
}
测试效果
部分
(1)ES6 模块 介绍
use strict;
(2)ES6 基本用法
1. export 与 import
/*-----export [test.js]-----*/
let myName = "Tom";
let myAge = 20;
let myfn = function() {
return "My name is" + myName + "! I'm '" + myAge + "years old."
}
let myClass = class myClass {
static a = "yeah!";
}
export { myName, myAge, myfn, myClass }
/*-----import [xxx.js]-----*/
import { myName, myAge, myfn, myClass } from "./test.js";
console.log(myfn()); // My name is Tom! I'm 20 years old.
console.log(myAge); // 20
console.log(myName); // Tom
console.log(myClass.a); // yeah!
2. as 的用法
/*-----export [test.js]-----*/
let myName = "Tom";
export { myName as exportName }
/*-----import [xxx.js]-----*/
import { exportName } from "./test.js";
console.log(exportName); // Tom
// 使用 as 重新定义导出的接口名称, 隐藏模块内部的变量
/*-----export [test1.js]-----*/
let myName = "Tom";
export { myName }
/*-----export [test2.js]-----*/
let myName = "Jerry";
export { myName }
/*-----import [xxx.js]-----*/
import { myName as name1 } from "./test1.js";
import { myName as name2 } from "./test2.js";
console.log(name1); // Tom
console.log(name2); // Jerry
3. import 命令的特点
只读属性
import {a} from "./xxx.js"
a = {}; // error
import {a} from "./xxx.js"
a.foo = "hello"; // a = { foo : 'hello' }
单例模式
import { a } "./xxx.js";
import { a } "./xxx.js";
// 相当于 import { a } "./xxx.js";
import { a } from "./xxx.js";
import { b } from "./xxx.js";
// 相当于 import { a, b } from "./xxx.js";
静态执行特性
import { "f" + "oo" } from "methods"; // error
let module = "methods";
import { foo } from module; // error
if (true) {
import { foo } from "method1";
} else {
import { foo } from "method2";
}
// error
4. export default 命令
var a = "My name is Tom!";
export default a; // 仅有一个
export default var c = "error";
// error,default 已经是对应的导出变量,不能跟着变量声明语句
import b from "./xxx.js"; // 不需要加{}, 使用任意变量接收
注意:data()、@ 符号的作用
data() 中 return 的变量和方法只限于当前声明此 data() 的组件使用
data() 起到了不同位置同名变量隔离的一种效果
5. 复合使用
export { foo, bar } from "methods";
// 约等于下面两段语句,不过上面导入导出方式该模块没有导入 foo 与 bar
import { foo, bar } from "methods";
export { foo, bar };
/* ------- 特点 1 --------*/
// 普通改名
export { foo as bar } from "methods";
// 将 foo 转导成 default
export { foo as default } from "methods";
// 将 default 转导成 foo
export { default as foo } from "methods";
/* ------- 特点 2 --------*/
export * from "methods";
(3)vue.js 中 created 介绍
created()
是 vue.js 的一个生命周期钩子函数,当一个 vue 实例被生成后调用这个函数(4)JS 中 var、let、const 介绍
1. 全局变量
<p id="demo1">p>
<p id="demo2">p>
<script>
var carName = "Volvo";
// 这里可以使用 carName 变量
document.getElementById("demo1").innerHTML = "外部访问" + carName;
myFunction();
function myFunction() {
// 这里也可以使用 carName 变量
document.getElementById("demo2").innerHTML = "内部访问" + carName;
}
script>
2. 局部变量
注意:不声明 var 情况
<p id="demo1">p>
<p id="demo2">p>
<script>
myFunction();
document.getElementById("demo").innerHTML = "局内声明var的类型是:" + typeof name1;
document.getElementById("demo").innerHTML = "局内不声明var的类型是:" + typeof name2;
function myFunction() {
var name1 = "Volvo";
name2 = "Volvo"; // 不使用 var 为全局变量
}
script>
3. 块级作用域(Block Scope)
{}
外依然能被访问到{
var x = 2;
}
// 这里不能使用 x 变量
{}
内有效,在 {}
之外不能访问{
let x = 2;
}
// 这里不能使用 x 变量
4. 重新定义变量
var x = 10;
// 这里输出 x 为 10
{
var x = 2;
// 这里输出 x 为 2
}
// 这里输出 x 为 2
{}
内有效var x = 10;
// 这里输出 x 为 10
{
let x = 2;
// 这里输出 x 为 2
}
// 这里输出 x 为 10
5. 循环作用域
var i = 5;
for (var i = 0; i < 10; i++) {
// 一些代码...
}
// 这里输出 i 为 10
let i = 5;
for (let i = 0; i < 10; i++) {
// 一些代码...
}
// 这里输出 i 为 5
6. HTML 代码全局变量
<p id="demo1">p>
<p id="demo2">p>
<script>
var carName1 = "Volvo";
// 可以使用 window.carName 访问 var 变量
document.getElementById("demo1").innerHTML = "var变量:" + window.carName1;
let carName2 = "Volvo";
// 不能使用 window.carName 访问 let 变量
document.getElementById("demo2").innerHTML = "let变量:" + window.carName2;
script>
7. 重置变量
var x = 2;
// x 为 2
var x = 3;
// 现在 x 为 3
var x = 2; // 合法
let x = 3; // 不合法
{
var x = 4; // 合法
let x = 5 // 不合法
}
let x = 2; // 合法
let x = 3; // 不合法
{
let x = 4; // 合法
let x = 5; // 不合法
}
let x = 2; // 合法
var x = 3; // 不合法
{
let x = 4; // 合法
var x = 5; // 不合法
}
let x = 2; // 合法
{
let x = 3; // 合法
}
{
let x = 4; // 合法
}
8. 变量提升
// 在这里可以使用 carName 变量
var carName;
// 在这里不可以使用 carName 变量
let carName;
9. const 关键字
<p id="demo1">p>
<p id="demo2">p>
<script>
const PI = 3.141592653589793;
try {
PI = 3.14;
} catch (err1) {
document.getElementById("demo1").innerHTML = err1;
}
try {
PI = PI + 10;
} catch (err2) {
document.getElementById("demo2").innerHTML = err2;
}
script>
const
定义常量与使用 let
定义的变量相似:
const
声明的常量必须初始化,而 let
声明的变量不用var x = 10;
// 这里输出 x 为 10
{
const x = 2;
// 这里输出 x 为 2
}
// 这里输出 x 为 10
// 错误写法
const PI;
PI = 3.14159265359;
// 正确写法
const PI = 3.14159265359;
注意:const 定义的变量可变
<p id="demo">p>
<script>
// 创建常量对象
const car = {type: "Fiat", model: "500", color: "white"};
// 修改属性:
car.color = "red";
// 添加属性
car.owner = "Johnson";
// 显示属性
document.getElementById("demo").innerHTML = "Car owner is " + car.owner;
script>
const car = {type:"Fiat", model:"500", color:"white"};
car = {type:"Volvo", model:"EX60", color:"red"}; // 错误
修改常量数组
// 创建常量数组
const cars = ["Saab", "Volvo", "BMW"];
// 修改元素
cars[0] = "Toyota";
// 添加元素
cars.push("Audi");
const cars = ["Saab", "Volvo", "BMW"];
cars = ["Toyota", "Volvo", "Audi"]; // 错误
重置变量
var x = 2; // 合法
const x = 2; // 不合法
{
let x = 2; // 合法
const x = 2; // 不合法
}
const x = 2; // 合法
const x = 3; // 不合法
x = 3; // 不合法
var x = 3; // 不合法
let x = 3; // 不合法
{
const x = 2; // 合法
const x = 3; // 不合法
x = 3; // 不合法
var x = 3; // 不合法
let x = 3; // 不合法
}
const x = 2; // 合法
{
const x = 3; // 合法
}
{
const x = 4; // 合法
}
变量提升
carName = "Volvo"; // 在这里不可以使用 carName 变量
const carName = "Volvo";
(5)JS 中 Location 对象 介绍
1. Location 对象属性
location.hash
属性(点击进入)/ 实例地址
描述 / 实际输出结果
hash
返回一个 URL 的锚部分(从 # 号开始的部分,可读可写)
http://www.runoob.com/test.html#PART2
#part2
host
设置或返回一个 URL 的主机名和端口号(可读可写)
https://www.runoob.com/try
或 http://127.0.0.1:8848/demo.html
www.runoob.com
或 127.0.0.1:8848
(8848 为端口号)
hostname
设置或返回 URL 的主机名(可读可写)
https://www.runoob.com/try
或 http://127.0.0.1:8848/demo.html
www.runoob.com
或 127.0.0.1
href
设置或返回当前显示的文档的完整的 URL(可读可写)
https://www.runoob.com/jsref/prop-loc-href.html
https://www.runoob.com/jsref/prop-loc-href.html
pathname
设置或返回当前 URL 的路径部分(可读可写)
https://www.runoob.com/jsref/prop-loc-pathname.html
/jsref/prop-loc-pathname.html
port
设置或返回当前 URL 的端口部分(可读可写)
http://127.0.0.1:8848/demo.html
8848
protocol
返回一个 URL 协议
https://www.runoob.com/jsref/prop-loc-protocol.html
或 http://127.0.0.1:8848/demo.html
https:
或 http:
search
设置或返回一个URL的查询部分(从 ? 号开始的部分,可读可写)
http://www.runoob.com/submit.htm?email=someone@example.com
?email=someone@example.com
2. Location 对象方法
window.location.assign("http://www.runoob.com")
方法(点击进入)
说明
assign()
载入一个新的文档
reload()
重新载入当前文档
replace()
用新的文档替换当前文档
(6)JS 中 String 对象 介绍
new String()
var txt = new String("string");
// 简单方式
var txt = "string";
1. String 对象属性
属性(点击进入)
描述
constructor
对创建该对象的函数的引用
length
字符串的长度
prototype
允许您向对象添加属性和方法
2. String 对象方法
方法(点击进入)
描述
charAt()
返回在指定位置的字符
charCodeAt()
返回在指定的位置的字符的 Unicode 编码
concat()
连接两个或更多字符串,并返回新的字符串
fromCharCode()
将 Unicode 编码转为字符
indexOf()
返回某个指定的字符串值在字符串中首次出现的位置
includes()
查找字符串中是否包含指定的子字符串
lastIndexOf()
从后向前搜索字符串,并从起始位置(0)开始计算返回字符串最后出现的位置
match()
查找找到一个或多个正则表达式的匹配
repeat()
复制字符串指定次数,并将它们连接在一起返回
replace()
在字符串中查找匹配的子串, 并替换与正则表达式匹配的子串
search()
查找与正则表达式相匹配的值
slice()
提取字符串的片断,并在新的字符串中返回被提取的部分
split()
把字符串分割为字符串数组
startsWith()
查看字符串是否以指定的子字符串开头
substr()
从起始索引号提取字符串中指定数目的字符
substring()
提取字符串中两个指定的索引号之间的字符
toLowerCase()
把字符串转换为小写
toUpperCase()
把字符串转换为大写
trim()
去除字符串两边的空白
toLocaleLowerCase()
根据本地主机的语言环境把字符串转换为小写
toLocaleUpperCase()
根据本地主机的语言环境把字符串转换为大写
valueOf()
返回某个字符串对象的原始值
toString()
返回一个字符串
3. String HTML 包装方法
方法(点击进入)
描述
anchor()
创建 HTML 锚
big()
用大号字体显示字符串
blink()
显示闪动字符串
bold()
使用粗体显示字符串
fixed()
以打字机文本显示字符串
fontcolor()
使用指定的颜色来显示字符串
fontsize()
使用指定的尺寸来显示字符串
italics()
使用斜体显示字符串
link()
将字符串显示为链接
small()
使用小字号来显示字符串
strike()
用于显示加删除线的字符串
sub()
把字符串显示为下标
sup()
把字符串显示为上标
(7)Vue.js 路由 介绍
1. 安装
2. 简单实例
是一个组件,该组件用于设置一个导航链接,切换不同 HTML 内容to
属性为目标地址, 即要显示的内容class ="router-link-exact-active router-link-active"
HTML 代码
<script src="https://unpkg.com/vue/dist/vue.js">script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js">script>
<div id="app">
<h1>Hello App!h1>
<p>
<router-link to="/foo">Go to Foorouter-link>
<router-link to="/bar">Go to Barrouter-link>
p>
<router-view>router-view>
div>
JavaScript 代码
// 0. 如果使用模块化机制编程,导入 Vue 和 VueRouter,要调用 Vue.use(VueRouter)
// 1. 定义(路由)组件
// 可以从其他文件 import 进来
const Foo = { template: '
运行截图
3.
相关属性to
replace
append
tag
渲染成某种标签,例如 tag
prop 类指定何种标签,同样它还是会监听点击,触发导航
active-class
链接激活时使用的 CSS 类名
exact-active-class
event
代码编写
块代码
/
后的字符串(不包括 /
)
实现不同 vue 页面输出在
中
【截图7 App.vue 完成】
效果测试
(1)新建 TopNews.vue
【截图8 TopNews.vue】
(2)新建 TypeNews.vue
【截图9 TypeNews.vue】
(3)编写 router\index.js
import Vue from 'vue'
import VueRouter from 'vue-router'
import TopNews from '../views/TopNews.vue'
import TypeNews from '../views/TypeNews.vue'
Vue.use(VueRouter)
const routes = [{
path: '/',
name: 'Home',
component: TopNews
}, {
path: '/topNews',
name: 'TopNews',
component: TopNews
}, {
path: '/typeNews',
name: 'TypeNews',
component: TypeNews
}]
const router = new VueRouter({
routes
})
export default router
{
path: "/user/:id",
name: "user",
component: user
}
【截图10 router\index.js 完成】
(4)效果截图
项目运行方法
五、制作分页页面
1. 列表组件 NewsList.vue
(1)src\components 组件 介绍
Vue.component(tagName, options)
1. 全局组件
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js">script>
<div id="app">
<runoob>runoob>
div>
<script>
// 注册
Vue.component('runoob', {
template: '
自定义组件!
'
})
// 创建根实例
new Vue({
el: '#app'
})
script>
2. 局部组件
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js">script>
<div id="app">
<runoob>runoob>
div>
<script>
var Child = {
template: '
局部组件!
'
}
// 创建根实例
new Vue({
el: '#app',
components: {
//
3. prop
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js">script>
<div id="app">
<child message="prop传递数据">child>
div>
<script>
// 注册
Vue.component('child', {
// 声明 props
props: ['message'],
// 同样也可以在 vm 实例中像 “this.message” 这样使用
template: '
{{ message }}
'
})
// 创建根实例
new Vue({
el: '#app'
})
script>
4. 动态 prop
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js">script>
<div id="app">
<div>
<input v-model="parentMsg">
<br>
<child v-bind:message="parentMsg">child>
div>
div>
<script>
// 注册
Vue.component('child', {
// 声明 props
props: ['message'],
// 同样也可以在 vm 实例中像 “this.message” 这样使用
template: '{{ message }}'
})
// 创建根实例
new Vue({
el: '#app',
data: {
parentMsg: '动态prop数据'
}
})
script>
注意:prop 是单向绑定的
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js">script>
<div id="app">
<ol>
<todo-item v-for="item in sites" v-bind:todo="item">todo-item>
ol>
div>
<script>
Vue.component('todo-item', {
props: ['todo'],
template: '
5. prop 验证
Vue.component('my-component', {
props: {
// 基础的类型检查 (`null` 和 `undefined` 会通过任何类型验证)
propA: Number,
// 多个可能的类型
propB: [String, Number],
// 必填的字符串
propC: {
type: String,
required: true
},
// 带有默认值的数字
propD: {
type: Number,
default: 100
},
// 带有默认值的对象
propE: {
type: Object,
// 对象或数组默认值必须从一个工厂函数获取
default: function() {
return {
message: 'hello'
}
}
},
// 自定义验证函数
propF: {
validator: function(value) {
// 这个值必须匹配下列字符串中的一个
return ['success', 'warning', 'danger'].indexOf(value) !== -1
}
}
}
})
String
Number
Boolean
Array
Object
Date
Function
Symbol
( 表示独一无二的值,用来定义对象的唯一属性名【菜鸟教程链接】 )
6. filters 过滤器
{{ 原数据 | 过滤方法 }}
{{ message | filterA | filterB }}
{{ message | filterA('arg1', arg2) }}
(2)代码编写
csdn_topnews\src\components\NewList.vue
部分
{{item.title | titleFilter}}
部分
部分
box-sizing: content-box|border-box|inherit;
user-select: none|text|all|element;
flex: flex-grow flex-shrink flex-basis|auto|initial|inherit;
效果截图
【截图11 components\NewList.vue 完成】
2. 完善头条新闻 TopNews.vue
(1)分页头部图片素材
https://img-blog.csdnimg.cn/20210310152819703.png
(2)Vue.js Ajax(axios) 介绍
注意:跨域问题
1. GET 方法
简单读取 JSON 数据
https://www.runoob.com/try/ajax/json_demo.json
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js">script>
<script src="https://cdn.staticfile.org/axios/0.18.0/axios.min.js">script>
<div id="app">
{{ info }}
div>
<script type="text/javascript">
new Vue({
el: '#app',
data() {
return {
info: null
}
},
mounted() {
axios
.get('https://www.runoob.com/try/ajax/json_demo.json')
.then(response => (this.info = response))
.catch(function(error) { // 请求失败处理
console.log(error);
});
}
})
script>
使用 response.data 读取 JSON 数据
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js">script>
<script src="https://cdn.staticfile.org/axios/0.18.0/axios.min.js">script>
<div id="app">
<div v-for="site in info">
{{ site.name }}
div>
div>
<script type="text/javascript">
new Vue({
el: '#app',
data() {
return {
info: null
}
},
mounted() {
axios
.get('https://www.runoob.com/try/ajax/json_demo.json')
.then(response => (this.info = response.data.sites))
.catch(function(error) { // 请求失败处理
console.log(error);
});
}
})
script>
传递参数说明
// 直接在 URL 上添加参数 ID=12345
axios.get('/user?ID=12345')
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
// 也可以通过 params 设置参数:
axios.get('/user', {
params: {
ID: 12345
}
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
2. POST 方法
简单读取 JSON 数据
https://www.runoob.com/try/ajax/demo_axios_post.php
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js">script>
<script src="https://cdn.staticfile.org/axios/0.18.0/axios.min.js">script>
<div id="app">
{{ info }}
div>
<script type="text/javascript">
new Vue({
el: '#app',
data() {
return {
info: null
}
},
mounted() {
axios
.post('https://www.runoob.com/try/ajax/demo_axios_post.php')
.then(response => (this.info = response))
.catch(function(error) { // 请求失败处理
console.log(error);
});
}
})
script>
传递参数说明
axios.post('/user', {
firstName: 'Fred', // 参数 firstName
lastName: 'Flintstone' // 参数 lastName
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
3. 执行多个并发请求
function getUserAccount() {
return axios.get('/user/12345');
}
function getUserPermissions() {
return axios.get('/user/12345/permissions');
}
axios.all([getUserAccount(), getUserPermissions()])
.then(axios.spread(function (acct, perms) {
// 两个请求现在都执行完成
}));
4. axios API
axios(config)
// 发送 POST 请求
axios({
method: 'post',
url: '/user/12345',
data: {
firstName: 'Fred',
lastName: 'Flintstone'
}
});
// GET 请求远程图片
axios({
method:'get',
url:'http://bit.ly/2mTM3nY',
responseType:'stream'
})
.then(function(response) {
response.data.pipe(fs.createWriteStream('ada_lovelace.jpg'))
});
axios(url[, config])
// 发送 GET 请求(默认的方法)
axios('/user/12345');
(3)箭头函数 介绍
(参数1, 参数2, …, 参数N) => { 函数声明 }
(参数1, 参数2, …, 参数N) => 表达式(单一)
// 相当于:(参数1, 参数2, …, 参数N) =>{ return 表达式; }
(单一参数) => {函数声明}
单一参数 => {函数声明}
() => {函数声明}
(4)代码编写
csdn_topnews\src\views\TopNews.vue
部分
中引入(import)并声明组件(components)
部分
.vue
),别名为 NewLists
'/juheNews/toutiao/index'
:/juheNews
为重写的路径(可参考 vue.config.js),/toutiao/index
根据请求示例编写(可参考聚合数据请求示例编写)
params:{type:'top',key:'获取的key'}
:参数在 get 请求中变为 toutiao/index?type=top&key=获取的key
response=>{this.newsList=response.data.result.data;}
:相当于 function(response){this.newList=response.data.result.data;}
components:{NewsList}
:声明组件,NewList 为引入模板组件后的别名
部分
components\NewList.vue
中完成,所以只需定义头部图片样式即可效果截图
3. 完善分类新闻 TypeNews.vue
代码编写
部分
和
:图片和链接随 data 中的 news[] 内容改变而立即产生改变 组成,点击后触发头部图片、新闻列表的更改
v-for="item in typeList"
:typeList 为 data 中的 (id,name) 键值对组,其中 id 作为参数传入 API 请求格式的 type,name 作为按钮的显示内容:class="{typeinit:isAlive==item.id}"
:使用 v-bind 判断该 按钮的 item.id 值是否与 data 中的 isAlive 相同,typeinit 为选中按钮的 CSS 样式,实现单独改变选中按钮的样式
@click="change(item.id)"
:change(id) 方法更改 data 中的 isAlive 值,并且更换获取 API 数据时的 type 值
部分
'shehui'
部分
效果截图
【截图13 TypeNews.vue 完成】
六、整体效果
{id: ‘shishang’,name: ‘时尚’}],
isAlive: ‘shehui’,
newsList: [],
news: {}
}
},
created() {
this.getNews(‘shehui’);
},
methods: {
getNews(type) {
this.$axios.get(’/juheNews/toutiao/index’, {
params: {
type: type,
key: ‘获取的key’
}
}).then(response => {
this.newsList = response.data.result.data;
this.news = this.newsList[Math.floor(Math.random() * this.newsList.length)];
})
.catch(error => {
console.log(error);
});
},
change(id) {
this.isAlive = id;
this.getNews(id);
}
},
components: {
NewsList
}
}
isAlive:用于判断分类按钮的样式,默认为 `'shehui'`
news:从 newList[] 中随机抽取一条存入 news,用于头部新闻图片
Math.floor():返回不大于的最大整数
Math.random(): 返回介于 0(包含)~ 1(不包含)之间的一个随机数
change(id):更改 data 中的 isAlive 值实现按钮样式变换,并且更换获取 API 数据时的 type 值实现新闻列表内容更改
---
#### `
效果截图
【截图13 TypeNews.vue 完成】
六、整体效果
完成!