Vue入门四(计算属性|监听属性|组件介绍|父子通信|Ref属性|动态组件)

一、计算属性

<!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>

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LoisMay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值