2、代码实例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
{{totalPrice()}}
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '你好'
},
methods :{
totalPrice(){
const nums = [10,9,21,16,7]
let total = nums.filter(x => x<10).map(x => x*2).reduce((pre,n)=>pre+n);
console.log(total)
return total
}
}
})
</script>
</body>
</html>
二、v-model
vue中经常使用到和这类表单元素,vue对于这些元素的数据绑定和我们以前经常用的jQuery有些区别。vue使用v-model实现这些标签数据的双向绑定,它会根据控件类型自动选取正确的方法来更新元素。
1、v-model双向绑定
<input type="text" v-model="message">
v-model动态双向绑定实现原理,本质上包含两个操作:
(1)v-bind绑定一个value属性
(2)v-on指令给当前元素绑定input事件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!-- <input type="text" :value="message" v-on:input="valueChange">
<input type="text" :value="message" @input="valueChange"> -->
<input type="text" :value="message" @input="message = $event.target.value">
{{message}}
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '哪吒'
},
methods: {
valueChange(event){
this.message = event.target.value;
}
}
})
</script>
</body>
</html>
2、v-model和radio结合使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<label for="male">
<!-- <input type="radio"id="male" name="sex" value="男"
v-model="sex">男
<input type="radio"id="female" name="sex" value="女"
v-model="sex">女 -->
<input type="radio"id="male" value="男" v-model="sex">男
<input type="radio"id="female" value="女" v-model="sex">女
</label>
<h3>您选择的是:{{sex}}</h3>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '你好',
sex: '女'
}
})
</script>
</body>
</html>
3、v-model和CheckBox单选框结合使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!-- checkbox单选框 -->
<label for="license">
<input type="checkbox"id="license" v-model="isAgree">同意协议
</label>
<h3>您选择的是:{{isAgree}}</h3>
<button :disabled="!isAgree">下一步</button>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '你好',
isAgree: false
}
})
</script>
</body>
</html>
4、v-model和CheckBox多选框结合使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!-- checkbox多选框 -->
<input type="checkbox" value="比比东" v-model="girls">比比东
<input type="checkbox" value="千仞雪" v-model="girls">千仞雪
<input type="checkbox" value="美杜莎" v-model="girls">美杜莎
<input type="checkbox" value="云韵" v-model="girls">云韵
<input type="checkbox" value="雅妃" v-model="girls">雅妃
<h3>您选择的是:{{girls}}</h3>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '你好',
girls: []
}
})
</script>
</body>
</html>
5、v-model结合select使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!-- 选择一个 -->
<select name="abc" v-model="girl">
<option value="云韵">云韵</option>
<option value="比比东">比比东</option>
<option value="雅妃">雅妃</option>
<option value="千仞雪">千仞雪</option>
<option value="美杜莎">美杜莎</option>
</select>
<h3>您的选择是:{{girl}}</h3>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '你好',
girl: '云韵'
}
})
</script>
</body>
</html>
6、v-for值绑定
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<label v-for="item in beautyGirls" :for="item">
<input type="checkbox" :value="item"
:id="item" v-model="girls">{{item}}
</label>
<h3>您的选择是:{{girls}}</h3>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '你好',
girls: [],//多选框
beautyGirls: ["云韵","比比东","雅妃","纳兰嫣然","美杜莎"]
}
})
</script>
</body>
</html>
7、v-model修饰符的使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!-- lazy懒加载,失去焦点时触发 -->
<input type="text" v-model.lazy="message">
<h2>{{message}}</h2>
<!-- number:表示数字类型 -->
<input type="number" v-model.number="age">
<h2>{{age}} --> {{typeof age}}</h2>
<!-- 去掉左右两边的控股 -->
<input type="text" v-model.trim="name">
<h2>{{name}}</h2>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '哪吒',
age: 0,
name: '哪吒'
}
})
</script>
</body>
</html>
三、组件化开发
组件是Vue.js中重要思想
- 它提供了一种抽象, 我们可以开发出一个独立可复用的小组件来构造我们的应用组件
- 可以扩展 HTML 元素,封装可重用的代码
- 组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面都可以抽象为一个组件树
组件化思想应用
- 有了组件化的思想, 我们之后开发中就要充分的利用它
- 尽可能将页面拆分成一个个小的, 可复用的组件
- 这样让我们代码更方便组织和管理, 并且扩展性也强
1、全局组件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<my-cpn></my-cpn>
</div>
<script src="../js/vue.js"></script>
<script>
//1.创建组件化构造器对象
const cpnC = Vue.extend({
template: `
<div>
<h2>我是标题</h2>
<p>我是CSDN哪吒</p>
</div>
`
})
//2.注册组件
Vue.component('my-cpn',cpnC)
const app = new Vue({
el: '#app',
data: {
message: '你好'
}
})
</script>
</body>
</html>
2、局部组件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<cpn></cpn>
</div>
<script src="../js/vue.js"></script>
<script>
//1.创建组件化构造器对象
const cpnC = Vue.extend({
template: `
<div>
<h2>我是标题</h2>
<p>我是CSDN哪吒</p>
</div>
`
})
const app = new Vue({
el: '#app',
data: {
message: '你好'
},
components: {
cpn: cpnC
}
})
</script>
</body>
</html>
3、父子组件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<cpn2></cpn2>
</div>
<script src="../js/vue.js"></script>
<script>
//1.创建组件化构造器对象
const cpnC1 = Vue.extend({
template: `
<div>
<h2>我是标题1</h2>
<p>我是CSDN哪吒</p>
</div>
`
})
const cpnC2 = Vue.extend({
template: `
<div>
<h2>我是标题2</h2>
<p>我是博客专家</p>
<cpn1></cpn1>
</div>
`,
components: {
cpn1: cpnC1
}
})
const app = new Vue({
el: '#app',
data: {
message: '你好'
},
components: {
cpn2: cpnC2
}
})
</script>
</body>
</html>
4、组件化语法糖写法
vue为了简化注册组件的过程,提供了语法糖的写法,主要是省去了调用Vue.extend()的步骤,直接使用一个对象替代。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<my-cpn></my-cpn>
</div>
<script src="../js/vue.js"></script>
<script>
//注册组件语法糖写法
Vue.component('my-cpn',{
template: `
<div>
<h2>我是标题</h2>
<p>我是CSDN哪吒</p>
</div>
`
})
const app = new Vue({
el: '#app',
data: {
message: '你好'
}
})
</script>
</body>
</html>
5、组件模板抽离写法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<cpn></cpn>
<cpn></cpn>
<cpn></cpn>
</div>
<!--1.script标签, 注意:类型必须是text/x-template-->
<!--<script type="text/x-template" id="cpn">-->
<!--<div>-->
<!--<h2>我是标题</h2>-->
<!--<p>我是CSDN哪吒</p>-->
<!--</div>-->
<!--</script>-->
<!--2.template标签-->
<template id="cpn">
<div>
<h2>我是标题</h2>
<p>我是CSDN哪吒</p>
</div>
</template>
<script src="../js/vue.js"></script>
<script>
// 1.注册一个全局组件
Vue.component('cpn', {
template: '#cpn'
})
const app = new Vue({
el: '#app',
data: {
message: '你好啊'
}
})
</script>
</body>
</html>
四、组件可以访问Vue实例数据吗?
1、简介
实验发现,组件不能访问Vue实例数据,而且即便可以访问,如果将所有的数据都放在Vue实例中,Vue实例就会变得非常臃肿。
Vue组件应该有自己保存数据的地方。
组件自己的数据存放在哪里?
- 组件对象也有一个data属性(也有method等属性);
- 只是这个data属性必须是一个函数;
- 而且这个函数返回一个对象,对象内部保存着数据;
2、代码实例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<cpn></cpn>
</div>
<template id="cpn">
<div>
<h2>{{title}}</h2>
<p>我是热门</p>
</div>
</template>
<script src="../js/vue.js"></script>
<script>
// 1.注册一个全局组件
Vue.component('cpn', {
template: '#cpn',
data() {
return {
title: '哪吒必胜'
}
}
})
const app = new Vue({
el: '#app',
data: {
message: '你好',
// title: '我是标题'
}
})
</script>
</body>
</html>
3、效果展示
五、父子组件通信
1、父子组件通信简介
Vue 面试题
1.Vue 双向绑定原理
2.描述下 vue 从初始化页面–修改数据–刷新页面 UI 的过程?
3.你是如何理解 Vue 的响应式系统的?
4.虚拟 DOM 实现原理
5.既然 Vue 通过数据劫持可以精准探测数据变化,为什么还需要虚拟 DOM 进行 diff 检测差异?
6.Vue 中 key 值的作用?
7.Vue 的生命周期
8.Vue 组件间通信有哪些方式?
9.watch、methods 和 computed 的区别?
10.vue 中怎么重置 data?
11.组件中写 name 选项有什么作用?
12.vue-router 有哪些钩子函数?
13.route 和 router 的区别是什么?
14.说一下 Vue 和 React 的认识,做一个简单的对比
15.Vue 的 nextTick 的原理是什么?
16.Vuex 有哪几种属性?
17.vue 首屏加载优化
18.Vue 3.0 有没有过了解?
19.vue-cli 替我们做了哪些工作?
// title: ‘我是标题’
}
})
3、效果展示
五、父子组件通信
1、父子组件通信简介
Vue 面试题
1.Vue 双向绑定原理
2.描述下 vue 从初始化页面–修改数据–刷新页面 UI 的过程?
3.你是如何理解 Vue 的响应式系统的?
4.虚拟 DOM 实现原理
5.既然 Vue 通过数据劫持可以精准探测数据变化,为什么还需要虚拟 DOM 进行 diff 检测差异?
6.Vue 中 key 值的作用?
7.Vue 的生命周期
8.Vue 组件间通信有哪些方式?
9.watch、methods 和 computed 的区别?
10.vue 中怎么重置 data?
11.组件中写 name 选项有什么作用?
12.vue-router 有哪些钩子函数?
13.route 和 router 的区别是什么?
14.说一下 Vue 和 React 的认识,做一个简单的对比
15.Vue 的 nextTick 的原理是什么?
16.Vuex 有哪几种属性?
17.vue 首屏加载优化
18.Vue 3.0 有没有过了解?
19.vue-cli 替我们做了哪些工作?
[外链图片转存中…(img-80Kzy80b-1714369237625)]