vue框架入门笔记(速成vue)
vue4小时速成课概述一、vue基础1. vue简介2. 第一个vue程序3. el挂载点4. data数据对象二、本地应用1. v-text2. v-html3.4.5.三、网络应用四、综合应用概述学习vue的目的主要是为了完成毕业设计的前端页面编写,所以学的比较粗糙,主要是为了vue入门,观看的教学链接是: 黑马程序员vue前端基础教程-4个小时带你快速入门vue.一、vue基础1. vue简
vue4小时速成课
概述
学习vue的目的主要是为了完成毕业设计的前端页面编写,所以学的比较粗糙,主要是为了vue入门,观看的教学链接是:
黑马程序员vue前端基础教程-4个小时带你快速入门vue
【狂神说Java】Vue最新快速上手教程通俗易懂
一、vue基础
1. vue简介
- 一个
js
框架 - 简化
Dom
操作 响应式
数据驱动
数据发生变化,则页面上的数据显示也会随之发生变化。
2. 第一个vue程序
vue官方文档:https://cn.vuejs.org/
开发工具: webstorm
步骤
- 导入vue
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<!-- 生产环境版本,优化了尺寸和速度 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
- 创建vue实例对象,设置el、data属性
- el:选择元素
本例选择id为app的元素。 - data:vue实例使用的数据
本例包含一个值为’Hello Vue!'的message变量。
<script>
var app = new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
}
})
</script>
- 使用vu提供的模板语法渲染数据
{{}}用于获取vue实例中的数据,使用方式{{变量名}}。
<div id="app">
{{ message }}
</div>
first_demo.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>第一个vue程序</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<body>
<div id="app">
{{ message }}
</div>
</body>
<script>
var app = new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
}
})
</script>
</html>
网页效果
3. el挂载点
- 作用范围
data作用域范围在el挂载点命中标签的内部。 - 选择器
可以使用选择器,但是推荐id选择器。 - 支持标签
除了body、html
以外,所有的双标签都支持挂载。
el挂载点.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>el挂载点</title>
</head>
<body>
{{message}}
<div class="app">
{{message}}
<span>
{{message}}
</span>
</div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
var app = new Vue({
// el: '#app',
el: '.app',
data: {
message: '秋秋要加油呀'
}
})
</script>
</html>
网页效果
4. data数据对象
- 简单对象
{{变量名}}
- 复杂对象
{{对象名.变量名}}
- 数组
{{数组名[下标]}}
data数据对象.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>data数据对象</title>
</head>
<body>
<div id="app">
{{message}}
<h2>{{school.name}} {{school.mobile}}</h2>
<ul>
<li>{{compus[0]}}</li>
<li>{{compus[1]}}</li>
<li>{{compus[2]}}</li>
<li>{{compus[3]}}</li>
</ul>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
var app = new Vue({
el: "#app",
data:{
message: '秋秋要加油呀!',
//对象
school:{
name: "chocho",
mobile: '123456'
},
//数组
compus:['航空港', '龙泉', '人南', '青羊']
}
})
</script>
</body>
</html>
网页效果
二、本地应用
vue网页效果不是使用操作dom元素实现的,而是使用vue指令实现。
1. v-text
- 作用
设置标签文本值。 - 使用
- 添加属性的方式
<h2 v-text="变量名"></h2>
- 插值表达式方式
<h2>{{变量名}}</h2>
- 拼接的方式
<h2 v-text="变量名+‘chocho’"></h2>
<h2>{{变量名+‘chocho’}}</h2>
data数据对象.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>v-text</title>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<body>
<div id="app">
<h2 v-text="message + '@'">xyg</h2>
<h2 v-text="info + '@'">xyg</h2>
<h2>{{info + '@'}}xyg</h2>
</div>
</body>
<script>
var app = new Vue({
el: '#app',
data: {
message: '秋秋要加油呀!',
info: '梦公主好帅鸭!'
}
})
</script>
</html>
网页效果
2. v-html
- 作用
设置标签的innerHTML。 - 使用
若需要在内部渲染html效果,使用v-html;若不需要渲染html效果,则使用v-text。
data数据对象.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>v-html</title>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<body>
<div id="app">
<p v-html="content"></p>
<p v-text="content"></p>
</div>
</body>
<script>
var app = new Vue({
el: '#app',
data: {
//content: '秋秋要加油呀!'
content: '<a href="http://www.baidu.com">百度</a>'
}
})
</script>
</html>
网页效果
3. v-on
- 作用
为元素绑定事件。 - 使用
在需要绑定事件的元素上添加属性v-on,指明事件与对应的方法:
<input type='button' value='xxx' v-on:click='方法'>
<input type='button' value='xxx' v-on:mouseenter='方法'>
<input type='button' value='xxx' v-on:dbclick='方法'>
<!--其中v-on:可以使用@替换-->
<input type='button' value='xxx' @click='方法'>
<input type='button' value='xxx' @mouseenter='方法'>
<input type='button' value='xxx' @dbclick='方法'>
方法写在vue实例的methods属性中:
var app = new Vue({
el: '#app',
data: {},
methods:{
doIt: function(){
//函数逻辑
}
}
})
v-on.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>v-on</title>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<body>
<div id="app">
<!--传递自定义参数,事件修饰符 -->
<input type="button" value="v-on指令" @click="doIt(666)">
<input type="text" @keyup.enter="sayHi">
<!--vue修改数据方式:this.变量名-->
<h2 @click="changeFood">{{food}}</h2>
</div>
</body>
<script>
var app = new Vue({
el: '#app',
data: {
food: "可乐鸡翅"
},
methods:{
doIt: function (p1) {
alert("做It" + p1);
},
changeFood: function () {
console.log(this.food);
this.food += "好好吃!";
},
sayHi: function () {
alert("吃了没?");
}
}
})
</script>
</html>
网页效果
4. 计数器
-
功能
如图所示,
-
功能分析
点击左侧,则数字-1,若数字=0,则提示不能再减少了。
点击右侧,则数字+1。
使用vue实现,只需要对左右两侧绑定点击事件,当点击左侧,则将data中的变量-1,vue会自动渲染到页面上,若数字=0,则提示信息;当点击右侧,则将data中的变量+1。 -
代码实现
计数器.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>计数器</title>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<body>
<div id="app">
<!--计数器功能区-->
<div class="input-num">
<button @click="sub"> - </button>
<span>{{num}}</span>
<button @click="add"> + </button>
</div>
</div>
</body>
<script>
var app = new Vue({
el: '#app',
data: {
num: 1
},
methods: {
//加法
add: function () {
//console.log("add");
if(this.num < 10){
this.num++;
}else {
alert("最大值啦!")
}
},
//减法
sub: function () {
//console.log("sub");
if(this.num > 0){
this.num--;
}else {
alert("最小值啦!")
}
}
}
})
</script>
</html>
网页效果
5. v-show
-
作用
根据表达式真假,对元素进行显示和隐藏。
*通过操纵元素样式(display:none;)来实现显示/隐藏 -
代码实现
v-show.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>v-show</title>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<body>
<div id="app">
<input type="button" value="和公主躲猫猫!" @click="changeIsShow">
<img src="./img/梦公子.jpg" alt="" v-show="isShow" style="width: 200px">
<img src="./img/梦公子.jpg" alt="" v-show="age>=18" style="width: 200px">
</div>
</body>
<script>
var app = new Vue({
el: '#app',
data: {
isShow: false,
age: 19
},
methods:{
changeIsShow: function () {
this.isShow = !this.isShow;
}
}
})
</script>
</html>
网页效果
6. v-if
-
作用
根据表达式真假,对元素进行显示和隐藏。
*通过操纵dom元素来实现显示/隐藏。
*由于操纵dom元素消耗较大,因此如果是需要频繁切换的元素,则使用v-show,反之使用v-if。 -
代码实现
v-if.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>v-if</title>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<body>
<div id="app">
<input type="button" value="和公主躲猫猫!" @click="changeIsShow">
<img src="./img/梦公子.jpg" alt="" v-if="isShow" style="width: 200px">
</div>
</body>
<script>
var app = new Vue({
el: '#app',
data: {
isShow: false,
},
methods:{
changeIsShow: function () {
this.isShow = !this.isShow;
}
}
})
</script>
</html>
网页效果
7. v-bind
-
作用
动态设置元素的属性。 -
代码实现
v-bind.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>v-bind</title>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<style>
/*设置样式*/
.active{
border: 1px solid purple;
}
</style>
</head>
<body>
<div id="app">
<img v-bind:src="imgSrc" alt="" style="width: 200px">
<!--v-bind:简写为:-->
<img :src="imgSrc" alt="" style="width: 200px" :title="imgTitle" :class="{active:isActive}" @click="toggleActive">
</div>
</body>
<script>
var app = new Vue({
el: '#app',
data: {
imgSrc: './img/梦公子.jpg',
imgTitle: '梦公子',
isActive: false
},
methods:{
toggleActive: function () {
this.isActive = !this.isActive;
}
}
})
</script>
</html>
网页效果
8. 图片切换
-
功能
用户点击左右切换图片,当切换到最左侧/右侧图片时,则隐藏箭头。 -
功能分析
点击切换图片的本质是改变的图片src属性,图片的地址使用数组存储;显示以及隐藏图片则是对箭头的display进行操作。 -
代码实现
图片切换.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>图片切换</title>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<body>
<div id="app">
<div class="center">
<h2 class="title">梦公主</h2>
<!--左箭头-->
<span @click="prev" v-show="index!=0"> < </span>
<!--图片-->
<img :src="imgArr[index]" alt="" style="width: 200px">
<!--右箭头-->
<span @click="next" v-show="index<imgArr.length-1"> > </span>
</div>
</div>
</body>
<script>
var app = new Vue({
el: '#app',
data: {
imgArr: [
"./img/梦.jpg",
"./img/梦1.jpg",
"./img/梦2.jpg",
"./img/梦3.jpg",
"./img/梦4.jpg",
"./img/梦公子.jpg"
],
index: 0
},
methods:{
//上一张
prev: function () {
this.index--;
//console.log(this.index);
},
//下一张
next: function () {
this.index++;
//console.log(this.index);
}
}
})
</script>
</html>
网页效果
9. v-for
-
作用
根据数据生成列表结构。 -
代码实现
v-for.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>v-for</title>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<body>
<div id="app">
<ul>
<!--循环的是li标签,因此v-for添加在这里-->
<li v-for="(item,index) in arr" :title="item">
【{{index+1}}】{{item}}
</li>
<input type="button" @click="add" value="添加数据">
<input type="button" @click="remove" value="删除数据">
<h2 v-for="(item,index) in objArr">
我叫{{item.name}}
</h2>
</ul>
</div>
</body>
<script>
var app = new Vue({
el: '#app',
data: {
arr: [1, 2, 3, 4, 5],
objArr:[
{name:"chocho"},
{name:"anchor"}
]
},
methods:{
//增加数据
add: function () {
this.objArr.push({name:"xyg"});
},
//删除数据
remove: function () {
//默认移除第一个元素
this.objArr.shift();
}
}
})
</script>
</html>
网页效果
10. v-model
- 作用
双向数据绑定(需要和表单元素一起使用)。 - 代码实现
v-model.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>v-model</title>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<body>
<div id="app">
<input type="button" value="修改数据" @click="setM">
<input type="text" v-model="message" @keyup.enter="getM">
<h2>{{message}}</h2>
</div>
</body>
<script>
var app = new Vue({
el: '#app',
data: {
message: "chocho"
},
methods:{
getM: function () {
alert(this.message);
},
setM: function () {
this.message = "哎呀哎呀";
}
}
})
</script>
</html>
网页效果
8. 小黑记事本
- 功能
新增
回车新增事件显示
显示事件列表删除
点击删除事件统计
事件条数显示清空
清空事件,隐藏
且会隐藏底部标签
- 功能分析
- 新增+显示
生成列表结构(v-for+数组)
获取用户输入(v-model)
回车新增数据(v-on.enter) - 删除
点击删除指定内容(v-on+splice) - 统计
统计数据个数(数组长度v-text) - 清空
清空所有数据(v-on+清空数组) - 隐藏
当页面没有数据时隐藏(v-if/v-show)
- 代码实现
小黑记事本.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>小黑记事本</title>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<body>
<!--主体区域-->
<section id="todoapp">
<!--输入框-->
<header class="header">
<h1>小黑记事本</h1>
<input type="text" v-model="inputValue" @keyup.enter="add" autofocus="autofocus" autocomplete="off"
placeholder="请输入任务" class="new-todo">
</header>
<!--列表区域-->
<section class="main">
<ul class="todo-list">
<li class="todo" v-for="(item,index) in list">
<div class="view">
<span class="index" >{{index+1}}.</span>
<label for="">{{item}}</label>
<button @click="remove(index)" class="destroy">x</button>
</div>
</li>
</ul>
</section>
<!--统计和清空-->
<footer v-if="list.length>0" class="footer">
<span class="todo-count">
<strong>{{list.length}}</strong>条
</span>
<button class="clear-completed" @click="clearArr">Clear</button>
</footer>
</section>
<!--底部-->
<footer class="info"></footer>
</body>
<script>
var app = new Vue({
el: '#todoapp',
data: {
list: ["写代码", "微服务", "打豆豆", "撸猫"],
inputValue: "认真吃饭,好好生活"
},
methods:{
//新增
add: function () {
this.list.push(this.inputValue);
},
remove: function (index) {
//console.log("删除");
this.list.splice(index, 1);
},
clearArr: function () {
this.list = [];
}
}
})
</script>
</html>
网页效果
- 新增+显示+删除+统计
- 清空+隐藏
三、网络应用
1. axios基本使用
- 作用
网络请求库。 - 使用方法
//引入axios
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
//get请求
//第一个回调函数在请求响应后触发
//第二个回调函数在请求失败后触发
axios.get(地址?参数).then(function(response){},function(err){})
//post请求
axios.post(地址,参数对象).then(function(response){},function(err){})
- 代码实现
axios.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>axios</title>
</head>
<body>
<input type="button" value="get请求" class="get">
<input type="button" value="post请求" class="post">
</body>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
/*
接口1:随机笑话
请求地址: http://localhost:8080/api/joke/list
请求方法:get
请求参数:num(笑话条数,数字)
响应内容:随机笑话
*/
document.querySelector(".get").onclick = function () {
axios.get("http://localhost:8080/api/joke/list?num=1")
.then(function (response) {
console.log(response.data);
}, function (error) {
console.log("失败了");
console.log(error);
});
},
/*
接口2:用户注册
请求地址:http://localhost:8080/api/user/reg
请求方法:post
请求参数:username(用户名,字符串)
响应内容:注册成功或失败
*/
document.querySelector(".post").onclick = function () {
axios.post("http://localhost:8080/api/user/reg",
{username: "chocho"})
.then(function (response) {
console.log(response.data);
}, function (error) {
console.log("失败了");
console.log(error);
});
}
</script>
</html>
Java后端:接口
package com.chocho.webcompilecore.controller;
import com.chocho.webcompilecore.util.Msg;
import org.springframework.web.bind.annotation.*;
/**
* Created by chocho on 2022/1/24.
*/
@RestController
@RequestMapping("/api")
public class VueTestController {
@GetMapping("/joke/list")
public Msg getJokeList(@RequestParam("num") Integer num){
if(num <= 0){
return Msg.fail();
}
String jokes[] = new String[num];
for(int i = 0; i < num; i++){
jokes[i] = "讲个笑话" + i;
}
return Msg.success().add("jokes", jokes);
}
@PostMapping("/user/reg")
public Msg register(@RequestBody String username){
if(username == null || "".equals(username)){
return Msg.fail();
}else{
return Msg.success();
}
}
}
Java后端解决跨域问题
package com.chocho.webcompilecore.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
/**
* 实现基本的跨域请求
* Created by chocho on 2022/1/25.
*/
@Configuration
public class CorsConfig {
@Bean
public CorsFilter corsFilter() {
final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
final CorsConfiguration corsConfiguration = new CorsConfiguration();
/*是否允许请求带有验证信息*/
corsConfiguration.setAllowCredentials(true);
/*允许访问的客户端域名*/
corsConfiguration.addAllowedOrigin("*");
/*允许服务端访问的客户端请求头*/
corsConfiguration.addAllowedHeader("*");
/*允许访问的方法名,GET POST等*/
corsConfiguration.addAllowedMethod("*");
urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
return new CorsFilter(urlBasedCorsConfigurationSource);
}
}
网页效果
2. axios+vue
- 注意事项
- axios中的this已经改变,因此需要先将this存在that中,再调用axios,这样后面的数据访问才不会出错。
- 代码实现
axios_vue.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>axios_vue</title>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>
<div id="app">
<input type="button" value="获取笑话" @click="getJoke">
<p>{{joke}}</p>
</div>
</body>
<script>
var app = new Vue({
el: '#app',
data: {
joke: "很好笑的笑话"
},
methods:{
/*
接口3:随机笑话
请求地址:http://localhost:8080/api/joke
请求方法:get
请求参数:无
响应内容:一条随机笑话
*/
getJoke: function () {
var that = this;
//在axios中this改变了
axios.get("http://localhost:8080/api/joke")
.then(function (response) {
//console.log(response.data.data.joke);
that.joke = response.data.data.joke;
}, function (error) {
})
}
}
})
</script>
</html>
网页效果
3. 天知道
- 功能
- 回车查询
输入城市查询天气 - 点击查询
- 功能分析
-
回车查询
用户输入城市名称(v-model)
回车发送查询到服务器(@keyup.enter+axios.get)
服务器返回天气渲染页面(v-for) -
点击查询
点击事件(@click)
查询数据
渲染数据
- 代码实现
main.js
/*
接口:天气
请求地址:http://localhost:8080/api/weather
请求方法:get
请求参数:city
响应内容:天气信息
1、点击回车
2、查询数据
3、渲染数据
*/
var app = new Vue({
el: '#app',
data: {
city: "",
weatherList: []
},
methods:{
searchWeather: function () {
var that = this;
//console.log("天气查询");
axios.get("http://localhost:8080/api/weather?city=" + this.city)
.then(function (response) {
//console.log(response.data);
that.weatherList = response.data.data.weatherList;
}).catch(function (error) {
})
},
changeCity: function (city) {
//1.修改城市
this.city = city;
//2.查询天气
this.searchWeather();
}
}
})
天知道.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>天知道</title>
</head>
<body>
<div id="app">
<div class="search_form">
<div class="form_group">
<input v-model="city" @keyup.enter="searchWeather" type="text" class="input_txt" placeholder="请输入查询的天气">
<button class="input_sub">搜索</button>
</div>
<div class="hot_key">
<a href="javascript:;" @click="changeCity('北京')">北京</a>
<a href="javascript:;" @click="changeCity('上海')">上海</a>
<a href="javascript:;" @click="changeCity('广州')">广州</a>
<a href="javascript:;" @click="changeCity('深圳')">深圳</a>
</div>
</div>
<ul class="weather_list">
<li v-for="w in weatherList">
<div class="info_type"><span class="iconfont">{{w.type}}</span></div>
<div class="info_temp">
<b>{{w.low}}</b>~<b>{{w.high}}</b>
</div>
<div class="info_date"><span>{{w.date}}</span></div>
</li>
</ul>
</div>
</body>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<!--自定义js-->
<script src="./js/main.js"></script>
</html>
网页效果
四、vue进阶学习
1、计算属性computed
- 作用
computed
,使用vm.属性名调用,用于将不经常变化的计算结果缓存起来,以节约系统开销。
注意:methods与computed中的方法名重名,则优先运行methods中的方法。
2、插槽slot(*不建议学)
-
定义
用于实现动态网页。 -
代码实现
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>插槽slot</title>
</head>
<body>
<div id="app">
<todo>
<todo-p slot="todo-p" :title="title"></todo-p>
<todo-li slot="todo-li" v-for="item in todoItems" :item="item"></todo-li>
</todo>
</div>
</body>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
//定义vue组件
Vue.component("todo", {
//模板
template: '<div>\
<slot name="todo-p"></slot>\
<ul>\
<slot name="todo-li"></slot>\
</ul>\
</div>'
});
//数据组件
Vue.component('todo-p', {
props: ['title'],
template: '<p>{{title}}</p>'
});
Vue.component('todo-li', {
props: ['item'],
template: '<li>{{item}}</li>'
});
var vm = new Vue({
el: "#app",
data: {
title: '书籍列表',
todoItems: ['Java', 'Linux', 'Python']
}
});
</script>
</html>
更多推荐
所有评论(0)