首页 > 其他分享 >Vue急速入门-4

Vue急速入门-4

时间:2023-02-17 21:46:49浏览次数:34  
标签:Vue 入门 var 急速 template 组件 data methods

组件其他

根组件和组件的一些问题归总:
	1.new Vue() el:'xx' 管理的Div 就算根组件
	2.父子组件的数据是无法共享的
	3.组件有自己的html,css,js
	4.在组件中,this代指当前组件
	5.组件中data是一个函数,需要有返回值(return) 并且返回的是'对象'!
	6.全局组件内部的组件就是局部组件
	7.全局组件需要定义在Vue实例上面
	

组件间通信之父传子

组件间数据并不共享,需要进行数据传递!
父传子:使用自定义属性方法
在子组件标签上自定义绑定属性,并且在子组件props数组/对象中进行注册

image

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue/vue.js"></script>
</head>
<body>
<div id="app">
    <child :fage="fage" :fname="fname"></child>
</div>
</body>
<script>
    var vm = new Vue({
        el:'#app',
        data:{fname:'程潇',fage:18},
        methods:{},
        components: {
            'child':{
                template:`
           <div>
           <h1>子组件</h1>
           <br>
          名字:{{ fname }}<--->年龄:{{ fage }}
          </div>`, // 子组件的数据可以通过模板语法放入template层
                data(){
                    return{
                        cname:'刘亦菲'
                    }
                },
                // props: ['fage'] //如果我们需要父传给子数据 就需要将传输的数据变量名注册在props数组中
                props: {fage: String, fname: String},
                // props也支持对象方法:可以指定传输数据的数据类型,如果不符合对应的数据类型,就会报错,但是不影响显示
            }
        }
    })
</script>
</html>

父传子步骤

1.在父组件中将需要传递的数据通过props数组/对象注册
2.子组件标签中自定义绑定属性 :fage="fage",绑定的就是需要传递的数据
3.组件通过模板语法调用即可

组件间通信之子传父

# 通过在子标签编写自定义事件,并且在父组件中编写函数即可

流程详解
image

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue/vue.js"></script>
</head>
<body>
<div id="app">
    <div>
        <h2>父组件----子组件传递来的数据:{{fname}}</h2>

        <child @myevent="handleEvent"></child>
    </div>
</div>
</body>
<script>
    Vue.component('child',{
        template:`
<div>
<h2> 子传父演示</h2>
    <p><button @click="handleSend">点击提交数据</button></p>
</div>`,
        data(){
            return{
                cname:'小蜜瓜'
            }
        },
        methods:{
            handleSend() {
                this.$emit('myevent',this.cname)
            }
        }
    })
    // 父组件
    var vm = new Vue({
        el:'#app',
        data:{
            fname:''
        },
        methods:{
            handleEvent(cname){
                console.log(cname)
                this.fname = cname
            }
        }
    })
</script>
</html>

image

案例演示
通过在子组件中输入框输入内容,点击按钮传输到父组件中
image

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue/vue.js"></script>
</head>
<body>

<div id="app">
<h2>子传父数据展示>>>>>{{fText}}</h2>
    <child @cevent="handleRecv"></child>
</div>


</body>
<script>
    Vue.component('child',{
        template:`
        <div>
<h2>子传父案例演示~</h2>
     <p><input type="text" v-model="cText">请输入内容</p>
    <p> <button @click="handleSend">点击传输数据到父组件~</button></p>
</div>
        `,data(){
            return{
                cText:''
            }
        },
        methods:{
            handleSend(){
                console.log(this.cText)
                this.$emit('cevent',this.cText)
            }
        }
    })


    var vm = new Vue({
        el:'#app',
        data:{fText:''},
        methods:{
            handleRecv(cText){
                this.fText = cText
            }
        }
    })
</script>
</html>

子传父步骤

1.在子组件编写点击事件
2.在methods中通过this.$emit()方法将需要传递给父组件的数据编写进去
3.在 子组件标签中 自定义事件,绑定父组件函数!
4.父组件函数接收this.$emit()方法传递过来的参数

ref属性(也可以实现组件间通信:父和子通信都可以实现~)

  • ref放在标签上 拿到的是原生的DOM节点(标签对象)
  • ref放在组件上,拿到的是组件对象,对象中的数据,函数(方法)都可以直接使用
ref 属性可以更方便拿到实现父子通信

# ref属性放在普通标签上  例:<input type="text" ref="myinput">
	-通过this.$refs.myinput  拿到的是原生dom对象,通过原生dom修改 标签


#ref属性放在组件上   例:<child ref="mychild"></child>
	-通过this.$refs.mychild  拿到的是组件对象,既然拿到了组件对象,组件对象中的 变量,方法,都能直接通过 . 的方式调用
    -因此不需要关注是子传父,还是父传子,直接通过组件对象,使用即可
ref-父传子
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script src="vue/vue.js"></script>
</head>
<body>
<div id="app">

    <div>
        <h2>父传子-ref属性</h2>
        <h2>父组件--名字:{{fname}}--年龄:{{fage}}</h2>
        <p><button @click="changeChild">点我更新子组件数据</button></p>
    </div>

        <child ref="mychild"></child>


</div>
</body>
<script>
     var child ={
        template:`
        <div>
        <h2>子组件--名字:{{cname}}--年龄:{{cage}}</h2>
        </div>
        `,
        data(){
            return {
                cname:"刘亦菲",cage:'19'
            }
        },
        methods:{}
    }
    var vm = new Vue({ //根组件
        el:'#app',
        data:{
            fname:'牛牛',fage:'13'
        },
        methods:{
            changeChild(){
                console.log(this.$refs)
                this.$refs.mychild.cname = this.fname
                this.$refs.mychild.cage = this.fage
            }
        },
        components:{  //子组件 通过变量命名赋值给child
            child
        }
    })
</script>
</html>

image

ref-子传父
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script src="vue/vue.js"></script>
</head>
<body>
<div id="app">

    <div>
        <h2>子传父-ref属性</h2>
        <h2>父组件--名字:{{fname}}--年龄:{{fage}}</h2>
        <p><button @click="changeChild">点我更新子组件数据</button></p>
    </div>

        <child ref="mychild"></child>


</div>
</body>
<script>
     var child ={
        template:`
        <div>
        <h2>子组件--名字:{{cname}}--年龄:{{cage}}</h2>
        </div>
        `,
        data(){
            return {
                cname:"刘亦菲",cage:'19'
            }
        },
        methods:{}
    }
    var vm = new Vue({ //根组件
        el:'#app',
        data:{
            fname:'牛牛',fage:'13'
        },
        methods:{
            changeChild(){
                console.log(this.$refs)
                this.fname = this.$refs.mychild.cname
                this.fage = this.$refs.mychild.cage
            }
        },
        components:{  //子组件 通过变量命名赋值给child
            child
        }
    })
</script>
</html>

动态组件

1.不使用动态组件

组件不能用驼峰体!!!!!!!

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue/vue.js"></script>
</head>
<body>

<div id="app">

    <span @click="handleClick('home')">首页</span>|
    <span @click="handleClick('orderform')">订单</span> |
    <span @click="handleClick('goods')">商品</span>
    
    <home v-if="chooseType=='home'"></home>
    <orderform v-else-if="chooseType=='orderform'"></orderform>
    <goods v-else></goods>

</div>
</body>
<script>
    var goods = {
        template: `
          <div>
              <span>商品页</span>
          </div>
        `
    }
    var home = {
        template: `
          <div>
              <span>首页</span>
          </div>
        `
    }
    var orderform = {
        template: `
          <div>
              <span>订单页</span>
          </div>
        `
    }


    var vm = new Vue({
        el: '#app',
        data: {
            chooseType: 'home'
        },
        methods: {
            handleClick(some) {
                console.log(some)
                console.log(this.chooseType)
                this.chooseType = some
            }
        },
        components: {
            home, goods, orderform
        }
    })
</script>
</html>

不适用动态组件,需要多写几步,我们推荐使用动态组件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue/vue.js"></script>
</head>
<body>

<div id="app">

    <span @click="handleClick('home')">首页</span>|
    <span @click="handleClick('orderform')">订单</span> |
    <span @click="handleClick('goods')">商品</span>

    <component :is="chooseType"></component>

</div>
</body>
<script>
    var goods = {
        template: `
          <div>
              <span>商品页</span>
          </div>
        `
    }
    var home = {
        template: `
          <div>
              <span>首页</span>
          </div>
        `
    }
    var orderform = {
        template: `
          <div>
              <span>订单页</span>
          </div>
        `
    }


    var vm = new Vue({
        el: '#app',
        data: {
            chooseType: 'home'
        },
        methods: {
            handleClick(some) {
                this.chooseType = some
            }
        },
        components: {
            home, goods, orderform
        }
    })
</script>
</html>

keep-alive保持组件不销毁

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue/vue.js"></script>
</head>
<body>

<div id="app">

    <span @click="handleClick('home')">首页</span>|
    <span @click="handleClick('orderform')">订单</span> |
    <span @click="handleClick('goods')">商品</span>
    <keep-alive>
    <component :is="chooseType"></component>
    </keep-alive>
</div>
</body>
<script>
    var goods = {
        template: `
          <div>
              <span>商品页</span>
              <input type="text">
          </div>
        `
    }
    var home = {
        template: `
          <div>
              <span>首页</span>
              <input type="text">
          </div>
        `
    }
    var orderform = {
        template: `
          <div>
              <span>订单页</span>
              <input type="text">
          </div>
        `
    }


    var vm = new Vue({
        el: '#app',
        data: {
            chooseType: 'home'
        },
        methods: {
            handleClick(some) {
                this.chooseType = some
            }
        },
        components: {
            home, goods, orderform
        }
    })
</script>
</html>

image

插槽

	一般情况下,编写完一个组件之后,组件的内容都是写死的,
	如果我们需要添加数据 只能去组件中修改,拓展性很差
	插槽的概念:
		我们只需要在组件中添加 <slot></slot> 标签,即可在 body的组件标签中添加内容
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue/vue.js"></script>
</head>
<body>
<div class="app">

    <hr>
    <home>

        <div>
            <img src="11.jpg" alt="">
        </div>

    </home>
    <hr>

</div>

</body>
<script>

    var home = {
        template: `
          <div>
          <h1>home页面</h1>
            <slot></slot>
            <h1>结束了</h1>
          </div>`,

    }
    var vm = new Vue({
        el: '.app',
        data: {},
        components: {
            home,
        }


    })
</script>
</html>

image

具名插槽
我们在组件的slot 标签属性中添加 name="xx"
xx就是slot的名字, 在body中我们就可以指定slot来编写内容
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue/vue.js"></script>
</head>
<body>
<div class="app">

    <hr>
    <home>

        <div slot="start">
            <img src="11.jpg" alt="">
        </div>

         <p slot="end">五菱宏光刹不住,我是有田你记住</p>
    </home>
    <hr>

</div>

</body>
<script>

    var home = {
        template: `
          <div>
          <h1>home页面</h1>
            <slot name="start"></slot>
            <h1>结束了</h1>
            <slot name="end"></slot>
          </div>`,

    }
    var vm = new Vue({
        el: '.app',
        data: {},
        components: {
            home,
        }


    })
</script>
</html>

计算属性

计算属性只有使用的变量发生变化时,才重新运算
计算属性与python中的property伪装很像,可以将方法伪装成属性
计算属性基本使用

输入框输入英文首字母大写案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue/vue.js"></script>
</head>
<body>
<div id="app">
    <h1>
        编写单词,首字母转换成大写展示
    </h1>
    <input type="text" v-model="mytext">
    --{{getUp(mytext)}}
</div>
</body>

<script>
    var vm = new Vue({
        el: '#app',
        data: {
            mytext: ''
        },
        methods: {
            getUp(mytext) {
                console.log(mytext)
                return (mytext.slice(0, 1).toUpperCase() + mytext.slice(1))
            }
        }
    })
</script>
</html>

image

使用计算属性

过滤案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue/vue.js"></script>
</head>
<body>

<div id="app">

<h1>过滤案例</h1>
    <p>请输入想要搜索的内容 <input type="text" v-model="mytext" ></p>
<p>
  <ul>
        <li v-for="item in newDataList">{{item}}</li>
    </ul>
</p>

</div>

</body>
<script>
    var vm = new Vue({
        el:'#app',
        data:{
            mytext:'',
            dataList: ['a', 'at', 'atom', 'be', 'beyond', 'cs', 'csrf']
        },
        methods:{
        },
        computed:{
                newDataList(){
                    return this.dataList.filter(item=>item.indexOf(this.mytext)>=0)
                }
        }
    })

</script>
</html>

监听属性

在data中定义了一些变量,只要变量发生变化,我们就执行一个函数
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./js/vue.js"></script>
</head>
<body>
<div>
    <div class="app">
        <!--        <span @click="handleClick(1)">Python</span>|    <span @click="handleClick(2)">Linux</span>-->
        <span @click="course_type=1">Python</span>| <span @click="course_type=2">Linux</span>
        <div>
            假设有很多课程,点击上面的标签可以完成过滤
        </div>

    </div>

</div>
</body>
<script>
    var vm = new Vue({
        el: '.app',
        data: {
            course_type: '0'
        },
        created() {
            this.getData()
        },
        methods: {
            getData() {
                // 发送ajax ,获取所有课程,通过course过滤
                // http://127.0.0.1:8080/api/v1/courses?course_type=0
            },
            // handleClick(type){
            //     this.course_type=type
            //     this.getData()
            // }
        },
        watch: {
            course_type() {
                console.log('我变化了')
                this.getData()
            }
        }

    })


</script>
</html>

标签:Vue,入门,var,急速,template,组件,data,methods
From: https://www.cnblogs.com/ddsuifeng/p/17131542.html

相关文章

  • MyBatisPlus--入门
    入门案例MyBatisPlus(MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提高效率.1、新建springboot项目(版本2.5.0),仅保留JDBC 添加mybatisplus起步依赖和drui......
  • vue
    今日内容1.组件其它2.组件间通信之父传子3.组件间通信之子传父4.ref属性5.动态组件6.插槽7.计算属性8.监听属性9.node环境搭建1.组件其它根组件和组件一些问......
  • Vue生命周期钩子
     一:生命周期图官网原图我理解的图二、生命周期钩子函数描述beforeCreate创建Vue实例之前调用created创建Vue实例成功后调用(可以在此处发送异步请求后......
  • 嵌入式Linux入门级板卡的神经网络框架ncnn移植与测试-米尔i.MX6UL开发板
    本篇测评由电子发烧友的优秀测评者“ALSET”提供。米尔MYD-Y6ULX-V2开发板,基于NXPi.MX6UL/i.MX6ULL处理器,该开发板被米尔称之为经典王牌产品。本次测试目标是在此开发......
  • VUE组件相关知识
    目录VUE组件/组件数据传递组件间数据传递父传子组件间数据传递子传父更方便的父子组件数据-ref(推荐)基础方法实现导航栏动态组件实现导航/和keep_alive方法keep_alive方......
  • vue 购物车案例,v-model进阶,与后端交互,vue生命周期,vue组件
    昨日内容回顾#1v-for可以循环的类型#2js的循环方式-基于索引的循环(i=0;i<10;i++)-in循环出来的是索引-of基于迭代的,循环出来就是值-数组.......
  • 万字长文带你入门增量学习
    前言本文介绍了引入增量学习的必要性,继而引出最新的三种能够有效利用有效标签数据范式的增量学习方法。其次,针对这三大范式进行一个全面的调研,让大家对这个领域的整个发......
  • Vue对象常用属性
    Vue对象常用属性数据属性data数据属性的基本用法newVue({data:{'带引号的键':值,url:"www.baidu.com"//带引号的键}})在Vue实例中,我......
  • vue-day05——组件通信(父传子、子传父及其他小知识点)、ref属性、动态组件、slot插槽、
    目录一、组件其他二、组件间通信之父传子(通过自定义属性)三、组件间通信之子传父(通过自定义事件)四、ref属性五、动态组件5.0不使用动态组件5.1动态组件component标签5.2......
  • Vue 05
    Vue组件组件是(Component)是Vue.js最红要的功能之一。组件可以扩展HTML元素,封装可重用的代码组件系统还可以用独立,可复用的小组件来构建成大型应用,几乎任意类型的应用......