一、计算属性
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="./Js/vue.js"></script>
</head>
<body>
<div id="first">
<h1>计算属性函数方式</h1>
<input type="text" v-model="name"> ------> {{nameUpper()}}
<h1>计算属性Computed</h1>
<input type="text" v-model="name1"> ------> {{Upper}}
</div>
</body>
<script>
var vm = new Vue({
el: '#first',
data:{
name: '',
name1: '',
},
methods:{
nameUpper(){
console.log('页面发生变化就会执行 ')
return this.name.slice(0,1).toUpperCase() + this.name.slice(1)
}
},
computed:{
Upper(){
console.log('涉及到计算属性中使用变量发生变化')
return this.name1.slice(0,1).toUpperCase() + this.name1.slice(1)
}
}
})
</script>
</html>
1)重写过滤案例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="./Js/vue.js"></script>
</head>
<body>
<div id="first">
<h1>过滤案例计算属性方法</h1>
<p><input type="text" v-model="search" placeholder="请输入想要搜索的内容"></p>
<ul>
<li v-for="item in newdataList">{{item}}</li>
</ul>
</div>
</body>
<script>
var vm = new Vue({
el: '#first',
data:{
search: '',
dataList:[
'a', 'ace', 'am', 'atm',
'b', 'bit', 'big', 'baby',
'c', 'city', 'ccc',
],
},
computed:{
newdataList(){
return this.dataList.filter(item => item.indexOf(this.search) >= 0)
}
}
})
</script>
</html>
二、监听属性
监听一个属性的变化 只要它发生变化 就执行一个函数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="./Js/vue.js"></script>
</head>
<body>
<div id="first">
<span><button @click="type='篮球'">篮球</button>|<button @click="type='足球'">足球</button>|<button @click="type='台球'">台球</button></span>
<br>
<hr>
<br>
{{type}}
</div>
</body>
<script>
var vm = new Vue({
el: '#first',
data:{
type:'篮球',
},
watch:{
type(val){
console.log('修改后变成了,', val)
console.log('向后端加载数据')
}
}
})
</script>
</html>
三、组件介绍和定义
组件相当于Python中的模块 拓展HTML元素 可以重复使用的代码 使用它就是为了重复使用
例如:一个轮播图需要使用放到很多页面当中使用, 一个轮播图有它自己的Js Css Html,
组件就可以快捷的做出一个轮播图 有自己的JS Css Html放到一起 有自己的逻辑样式这样到哪里都可以使用了不用重复代码
定义组件
全局组件:全局可以使用的组件 可以用在任意其他的组件中
局部组件:局部组件只能在定义的组件中使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="./Js/vue.js"></script>
</head>
<body>
<div id="first">
<h1>全局组件</h1>
<child></child>
<hr>
<h1>局部组件</h1>
<like></like>
<hr>
</div>
</body>
<script>
var obj = {
template: `
<div>
<button>后退</button>
{{ title }}
<button @click="oneClick">前进</button>
</div>
`,
data() {
return {title: '标题'}
},
methods: {
oneClick() {
alert('前进')
}
},
}
Vue.component('child', obj)
var like = {
template: `
<div>{{ name }}
<child3></child3>
<child></child>
</div>
`,
data() {
return {name: 'Like'}
},
components: {
'child3': {
template: `
<div>
<h1>like组件内的组件</h1>
</div>
`
}
}
}
var vm = new Vue({
el:'#first',
data:{},
components:{
like
}
})
</script>
</html>
四、父子通信之父传子
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="./Js/vue.js"></script>
</head>
<body>
<div id="first">
<h1>自定义属性实现父子通信</h1>
{{name}}
<child :myname="name">name</child>
<hr>
</div>
</body>
<script>
var child = {
template:`
<div>
<h1>我是child组件</h1>
{{myname}}
</div>`,
props:{
myname: String,
},
created(){
console.log(typeof this.myname)
}
}
var vm = new Vue({
el: '#first',
data:{
name:'胡歌'
},
components:{
child
}
})
</script>
</html>
五、父子通信之子传父
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="./Js/vue.js"></script>
</head>
<body>
<div id="first">
<h1>父子通信</h1>
父组件中的name值为:{{name}}
<hr>
<child @myevnet="oneEvent"></child>
<hr>
</div>
</body>
<script>
var child = {
template:`
<div>
<h1>我是child组件</h1>
<input type="text" v-model="name"> -----> {{ name }}
<br>
<button @click="handleSend">点我把name传给父组件</button>
</div>`,
data(){
return{
name:''
}
},
methods:{
handleSend(){
this.$emit('myevnet', this.name) //在这里触发自定义事件的执行
}
}
}
var vm = new Vue({
el: '#first',
data:{
name:'胡歌'
},
methods:{
oneEvent(name){
this.name = name
}
},
components:{
child
}
})
</script>
</html>
六、Ref属性
Ref可以放在普通标签上 通过this.$refs.自定义的名称取到的是 原生的dom对象
Ref可以放在组件上 通过this.$refs.自定义的名称取到的是 Vc对象(组件对象)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="./Js/vue.js"></script>
</head>
<body>
<div id="first">
<h1>ref属性放在普通标签上</h1>
<input type="text" ref="myinput" v-model="name"> ------->{{name}}
<br>
<button @click="handlePrint">点我 打印</button>
<hr>
<h1>ref属性放在组件上</h1>
<child ref="mychild">{{name}}</child>
</div>
</body>
<script>
var child = {
template:`
<div>
<button>后退</button>
首页 ----{{age}} ------{{show}}
<button @click="handleQ('江疏影')">前进</button>
</div>`,
data(){
return{
show:true,
age:20
}
},
methods:{
handleQ(name){
alert(name)
}
}
}
var vm = new Vue({
el:'#first',
data:{
name:'迪丽热巴'
},
methods:{
handlePrint(){
this.$refs.myinput // 原生dom对象
this.$refs.myinput.value='XXXX'
console.log(this.$refs)
this.$refs.mychild.age=999
this.$refs.mychild.show = false
this.$refs.mychild.handleQ()
this.name = this.$refs.child.age
this.$refs.mychild.handleQ(this.name)
}
},
components:{
child
}
})
</script>
</html>
七、动态组件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="./Js/vue.js"></script>
</head>
<body>
<div id="first">
<div>
<span @click="type='home'">首页</span>|
<span @click="type='goods'">商品</span>|
<span @click="type='order'">订单</span>
</div>
<div>
<compoent :is="type"></compoent>
</div>
</div>
</body>
<script>
Vue.component('home', {
template:`
<div>
<h1>首页</h1>
</div>`,
})
Vue.component('goods',{
template: `
<div>
<h1>商品</h1>
</div>`,
})
Vue.component('order',{
template: `
<div>
<h1>订单</h1>
</div>`,
})
var vm = new Vue({
el: '#first',
data:{
type: 'home'
},
})
</script>
</html>
1)keep-alive
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="./Js/vue.js"></script>
</head>
<body>
<div id="first">
<div>
<span @click="type='home'">首页</span>|
<span @click="type='goods'">商品</span>|
<span @click="type='order'">订单</span>
</div>
<div>
<keep-alive>
<component :is="type"></component> <!-- 会缓存不会销毁了-->
</keep-alive>
</div>
</div>
</body>
<script>
Vue.component('home', {
template:`
<div>
<h1>首页</h1>
</div>`,
})
Vue.component('goods',{
template: `
<div>
<h1>商品</h1>
<input type="text" placeholder="请输入您想要搜索的内容"> <button>搜索</button>
</div>`,
})
Vue.component('order',{
template: `
<div>
<h1>订单</h1>
</div>`,
})
var vm = new Vue({
el: '#first',
data:{
type: 'home'
},
})
</script>
</html>
八、插槽
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="./Js/vue.js"></script>
</head>
<body>
<div id="app">
<h1>插槽的使用</h1>
<home>
<img src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fwww.yanziwoo.com%2Fuploads%2F281f15b06949f6c7209b397cb6576e46.jpg&refer=http%3A%2F%2Fwww.yanziwoo.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1669732052&t=1319bb27547b185ebe2c86feb318b719" width="200px" height="200px">
</home>
<hr>
<home>
<div>我是div</div>
</home>
<hr>
<goods>
<div slot="bottom">
我是底部
</div>
<a href="" slot="top">点我看美女</a>
</goods>
</div>
</body>
<script>
// 1 定义三个全局组件
Vue.component('home', {
template: `
<div>
<button>后退</button>
<span>首页</span>
<button>前进</button>
<hr>
<slot></slot>
</div>`,
})
Vue.component('goods', {
template: `
<div>
<slot name="top"></slot>
<hr>
<button>后退</button>
<span>首页</span>
<button>前进</button>
<hr>
<slot name="bottom"></slot>
</div>`,
})
var vm = new Vue({
el: '#app',
data: {
type: 'home'
},
})
</script>
</html>