首页 > 其他分享 >vue 组件

vue 组件

时间:2022-10-30 17:55:40浏览次数:74  
标签:vue name var Vue 组件 属性

组件

计算属性

如果 {{函数()}} ,每次页面刷新,函数都会重新执行

函数就是当属性使用,用于缓存

通过计算属性实现输入首字母大写

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./js/vue.js"></script>
</head>
<body>
<div id="app">
    <!--    <input type="text" v-model="name"> -&#45;&#45;》》 {{// name.slice(0, 1).toUpperCase() + name.slice(1)}}-->
    <input type="text" v-model="name"> ---》》 {{handleUpper()}}

    <hr>
    <input type="text" v-model="name2">--->{{upper}}
</div>
</body>

<script>
    var vm = new Vue({
        el: '#app',
        data: {
            name: '',
            name2: ''
        },
        methods: {
            handleUpper() {
                // 只要页面刷新就会变化
                console.log('我执行了')
                return this.name.slice(0, 1).toUpperCase() + this.name.slice(1)
            }
        },
        computed: {
            upper() {
                // 只有涉及到计算属性中使用的变量发生变化,它才重新运算
                console.log('计算属性我执行了')
                return this.name2.slice(0, 1).toUpperCase() + this.name2.slice(1)
            }
        }
    })
</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>
    <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: '#app',
        data: {
            search: '',
            dataList: ['a','at','atom','be','beyond','cs', 'csrf','d','dddd'],
			 },
        computed: {
            newdataList() {
                // 计算属性一定要return,因为计算属性的值就是咱们return的值
                return this.dataList.filter(item => item.indexOf(this.search) >= 0)
            }
        }


    })


</script>
</html>
属性 作用
methods 只要页面刷新就会变化
computed 只有涉及到计算属性中使用的变量发生变化,它才重新运算

监听属性

监听属性就是 监听一个属性的变化,只要它发生变化,就执行一个函数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./js/vue.js"></script>
</head>
<body>
<div id="app">
    <span> <button @click="type='人文'">人文</button>|<button @click="type='社科'">社科</button>|<button
            @click="type='地理'">地理</button></span>
    <br>
    {{type}}
</div>
</body>

<script>
    var vm = new Vue({
        el: '#app',
        data: {
            type: '人文',
        },
        watch: {
            type(val) {
                console.log('修改后变成了,', val)
                console.log('向后端加载数据了')
            }
        }
    })
</script>
</html>

组件介绍和定义

  • 组件的作用

    组件是扩展HTML 元素,封装可重用的代码,目的是复用

    如:有一个轮播,可以在很多页面中使用,一个轮播有js,css,html

    ​ 组件把js,css,html放到一起,有逻辑,有样式,有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>
    <child></child>
    <hr>

</div>
</body>
<script>
    // 1 定义全局组件 (必须在一个标签),组件有自己的数据,方法,生周期.....
    var obj = {
        template: `
          <div>
          <button>后退</button>
          {{ title }}
          <button @click="handleClick">前进</button>
          </div>`,
        data() {
            return {
                title: '标题'
            }
        },
        methods: {
            handleClick() {
                alert('前进')
            }
        },
    }
    Vue.component('child', obj)

</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">
    局部组件
    <lqz></lqz>
    <hr>

</div>
</body>
<script>
    // 局部组件

    var lqz = {
        template: `
          <div>
          <h1>我是lqz组件</h1>
          {{ name }}
          <child3></child3>
          <child></child>
          </div>`,
        data() {
            return {
                name: 'lqz'
            }
        },
        components: {
            'child3': {
                template: `
            <div>
              <h2>我是lqz组件内的组件</h2>
              </div>`,
            }
        }
    }
    var vm = new Vue({
        el: '#app',
        data: {},
        components: {
            lqz
        }

    })

</script>
</html>

组件通信

  • 父子组件传值 (props down, events up)

  • 父传子之属性验证props:{name:Number}Number,String,Boolean,Array,Object,Function,null(不限制类型)

  • 事件机制a.使用 $on(eventName) 监听事件b.使用 $emit(eventName) 触发事件

  • Ref this.$refs.mytext

  • 事件总线var bus = new Vue();* mounted生命周期中进行监听

父子通信之父传子

<!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>
    {{name}}
    <lqz :myname="10>9?true:false"></lqz>

</div>
</body>
<script>

    var lqz = {
        template: `
          <div>
          <h1>我是lqz组件</h1>
          {{ myname }}
          </div>`,
        // props: ['myname'],
        props: {
            myname: String,
        },
        created() {
            console.log(typeof this.myname)
        }

    }
    var vm = new Vue({
        el: '#app',
        data: {
            name: '刘亦菲'
        },
        components: {
            lqz
        }
    })

</script>
</html>

先在根组件中自定义属性,用进行绑定,再从子组件中写关键字props写个数组把自定义的属性名字放进去,传进去什么就是什么

父子通信之子传父

子组件通过 this.$emit('myevnet', this.name)

将自定义事件myevnet当成一个函数,将this.name当成参数传给父组件

<!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>
    父组件中的name值为:{{name}}
    <hr>
    <lqz @myevnet="handleEvent"></lqz>
    <hr>

</div>
</body>
<script>


    var lqz = {
        template: `
          <div>
          <h1>我是lqz组件</h1>
          <input type="text" v-model="name"> ---》{{ name }}
          <br>
          <button @click="handleSend">点我把name传给父组件</button>
          </div>`,
        data() {
            return {
                name: ''
            }
        },
        methods: {
            handleSend() {
                // alert('我被点了')
                // 在这里,触发自定义事件的执行
                this.$emit('myevnet', this.name)
            }
        }

    }
    var vm = new Vue({
        el: '#app',
        data: {
            name: '刘亦菲'
        },
        methods: {
            handleEvent(name) {
                this.name = name
            }
        },
        components: {
            lqz
        }
    })

</script>
</html>

ref属性

ref属性是vue定义的

可以放在普通标签上,通过this.$refs.自定义的名字取到的是 原生的dom对象

  • 使用原生dom操作了(不推荐)

ref属性也可以放在组件上:通过this.$refs.自定义的名字取到的是 vc对象(组件对象)

  • 可以之间使用组件对象上的方法和属性---》子的数据给了父亲

  • 父组件有个方法执行,需要传参数,传入子组件的数据---》子的数据给了父亲

  • 拿到子对象之间使用父中的数据修改----》父传子

总结

父只要拿到子的对象,子里面所有的属性和方法都可以用。

父用自己属性或方法的时候,也可以用子的执行结果给父。这就是ref放在组件上的作用

<!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>ref属性放在普通标签上</h1>
    <input type="text" ref="myinput" v-model="name">====>{{name}}
    <br>
    <button @click="handlePrint">点我,打印点东西</button>
    <hr>
    <h1>ref属性放在组件上</h1>
    <lqz ref="mylqz"></lqz>

</div>
</body>
<script>

    var lqz = {
        template: `
          <div>
          <button>后退</button>
          首页--{{ age }}---{{ show }}
          <button @click="handleQJ('迪丽热巴')">前进</button>
          </div>`,
        data() {
            return {
                show: true,
                age: 19
            }
        },
        methods: {
            handleQJ(name) {
                alert(name)
            }
        }

    }
    var vm = new Vue({
        el: '#app',
        data: {
            name: '刘亦菲'
        },
        methods: {
            handlePrint() {
                //this.$refs.myinput 原生dom对象
                // this.$refs.myinput.value='xxxxxx'
                console.log(this.$refs)
                // this.$refs.mylqz.age=999
                // this.$refs.mylqz.show = false
                // this.$refs.mylqz.handleQJ()
                // this.name=this.$refs.mylqz.age
                this.$refs.mylqz.handleQJ(this.name)

            }
        },
        components: {
            lqz
        }

    })

</script>
</html>

动态组件

component标签 里面有is属性进行绑定

案例:点击不同的标签,显示不同的组件

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

</head>
<body>
<div id="app">

    <div>
        <span @click="type='home'">首页</span>|
        <span @click="type='goods'">商品</span>|
        <span @click="type='order'">订单</span>
    </div>
    <div>
        <component :is="type"></component>
    </div>


</div>
</body>
<script>

    // 1 定义三个全局组件
    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: '#app',
        data: {
            type: 'home'
        },


    })


</script>
</html>

keep-alive使用

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="app">

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

    // 1 定义三个全局组件
    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: '#app',
        data: {
            type: 'home'
        },


    })


</script>
</html>

slot插槽 (内容分发)

  • 单个slot

  • 具名slot --- 在solt标签里用 name属性

    ​ 合父组件的内容与子组件自己的模板-->内容分发

    ​ 父组件模板的内容在父组件作用域内编译;子组件模板的内容在子组件作用域内编译。

<!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://tva1.sinaimg.cn/large/00831rSTly1gd1u0jw182j30u00u043b.jpg" 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>

vue-cli

  • vue-cli是vue的脚手架:快速帮我们创建出vue的项目

  • vue-cli可以创建vue2和vue3的项目 webpack构建工具

    ​ Vite:新一代构建工具

    ​ vue3上,推荐使用ts写 js

nodejs 的安装

使用vue脚手架需要先进性nodejs 的安装

  • nodejs 是后端语言---》语法就是js的语法

  • js运行在浏览器中,浏览器中有它的解释器环境

  • 不能运行在操作系统之上,把chrom浏览器的v8引擎,把它安装在操作系统上

    ​ c语言写了内置库:文件操作,网络操作

nodejs 安装的官网

https://nodejs.org/zh-cn/download/ ,下载,一路下一步

安装完会释放两个命令(在环境变量中,任意路径都能敲这俩命令)

node python3
npm pip
cnpm 等同于pip ,只是下模块,直接取淘宝镜像站下载,速度快

安装vue-cli

通过脚手架创建vue项目 (django--->django项目--->django-admin)

命令: cnpm install -g @vue/cli

只要装成功,又会多出一个可执行文件 vue

注意:

npm 下载时候,去国外,速度慢,使用国内镜像

淘宝做了一个cnpm可执行文件,用来替换npm,以后所有使用npm的地方都换成cnpm即可

安装cnpm

命令: npm install -g cnpm --registry=https://registry.npm.taobao.org

创建vue项目

vue create myfirstvue

ide的选择

vscode,webstorm:jetbrains公司的,跟pycharm一家的,使用习惯一样

选择使用pycharm+vue插件 开发vue项目

使用pycharm打开vue项目

运行vue项目

1.在命令行中敲:npm run serve

2.在pycharm中点击绿色箭头运行

image

image

image

image

标签:vue,name,var,Vue,组件,属性
From: https://www.cnblogs.com/nirvana001/p/16841804.html

相关文章

  • Vue复刻华为官网(三)
     1底部列表1.1思路如上图,这整个的大盒子,又可以被分为上中下三个小盒子,上、下盒子都被分为左右两个小盒子。这部分的难点主要体现在搜索栏上,特别是搜索栏聚焦的时候,会有一......
  • SSM框架+VUE+Mysql实现的疫苗预约接种管理系统(功能包含分角色,登录/注册、疫苗管理、接
    (博客目录)SSM框架+VUE+Mysql实现的疫苗预约接种管理系统本系统为了解决疫苗线下预约场景复杂,预约难等一系列问题,开发了疫苗接种管理平台,很好的提供了疫苗的管理和接种整......
  • vue3 reactive函数
    reactive的用法与的用法相似,也是将数据变成响应式数据,当数据发生变化时也会自动更新。不同的是用于基本数据类型,而是用于复杂数据类型,比如对象和数组例如:定义一个对象类型......
  • Vuex知识汇总
    vuex的五大核心state:存放公共数据/状态;getter:vuex独有的计算属性,获取state⾥⾯的状态,并且可以对数据进⾏处理之后在返回;mutations:修改state⾥⾯的数据,只能进⾏同步的操作......
  • 【Vue】从零搭建一个Vue项目
    一、项目创建1、打开命令行窗口Cd/d进入想要创建项目的位置,输入vuecreate项目名编辑2、选择Vue2编辑3、运行该项目编辑4、创建成功编辑 在浏览器中输入以上网址:localhos......
  • 【Vue】Vuex详解
     【前言】本博客系统的讲诉了Vuex的安装、搭建。以及Actions、Mutations、State、Getters的使用,为什么使用mapState、mapGetters以及一些细节的解释Vuex原理讲解 编辑Acti......
  • vue-cil搭建vue
    搭建vue-cil脚手架需要node.js环境去官网下载node.js  win系统cmdnode-v查看当前版本npminstallcnpm-g或者npminstall--registry=https://registry.npm.taoba......
  • vue echarts graph 关系图
    最近项目需要,用到了echart的grpah关系图,研究了下,大概就画个简单的吧html:<divid="app"><divid="main"class="echarts":style="{......
  • vue学习笔记
    今日内容概要计算属性监听属性组件介绍和定义父子通信之父传子父子通信之子传父ref属性动态组件插槽vue-cli今日内容详细计算属性我们可以通过计算属性c......
  • vue3路由的使用
    一、路由的概要1.1、什么是路由?路由就是一组映射关系,根据不同的url地址展示不同的内容或页面(key-value);key为路径,value可能是function或component 路......