Vue 组件 ref属性

Vue 组件 ref属性

文章目录

  • Vue 组件 ref属性
    • 1、计算属性
    • 2、计算属性重写过滤案例
    • 2、监听属性
    • 3、组件介绍和定义
    • 4、父子通信
      • 4.1、父传子
      • 4.2、父子通信 之子传父
    • 5、ref属性
    • 6、动态组件
    • 7、keep-alive
    • 8、插槽
    • 9、vue-cli

1、计算属性

如果{{函数()}}每次页面刷新,函数都会重新执行
函数–>当属性来使用,缓存

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
    <script src="./js/vue.js">script>
head>
<body>
<div id="app">
    
    <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>

2、计算属性重写过滤案例

以返回值方式呈现 不会改变原变量值

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

2、监听属性

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

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

3、组件介绍和定义

扩展 HTML 元素,封装可重用的代码,目的是复用
例如:有一个轮播,可以在很多页面中使用,一个轮播有js,css,html
组件把js,css,html放到一起,有逻辑,有样式,有html

定义组件()
全局组件:全局可以使用,可以用在任意其他组件中年
局部组件:局部组件只能在定义的位置(组件中)使用

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

head>
<body>
<div id="app">
    <h1>全局组件h1>
    <child>child>
    <hr>
    局部组件
    <lqz>lqz>
    <hr>

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

我是lqz组件

{{ name }}
`
, data() { return { name: 'lqz' } }, components: { 'child3': { template: `

我是lqz组件内的组件

`
, } } } var vm = new Vue({ el: '#app', data: {}, components: { lqz } })
script> html>

4、父子通信

组件和组件之间的数据,方法 都是隔离的,组件和组件之间要通信

// 通过 组件中 自定义 事件
<add @event="handleEvent">add>

4.1、父传子

通过 在props:[]接收 组件中 自定义事件属性 传入的 数据

// 通过 组件中 自定义 事件
<div>
<add @event="handleEvent">add>
div>

// 组件中 接收 该变量名

props:['myname'],

4.2、父子通信 之子传父

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

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

    <add @event="handleEvent"></add>
    <div>
        <h2>父组件</h2>
        {{name}}
    </div>

</div>
</body>
<script>
    var add = {
        template: `<div>
        <button>这是局部组件</button>
        <input v-model="name" type="text"><button @click="handleSend">传数据至 父组件</button>
        {{name}}
        </div>`,
        data(){
            return{name:'pyy'}
        },
        methods: {
          handleSend() {
              alert('将子组件 数据传如全局')
              this.$emit('event',this.name)
          }
        },
        props:['myname'],


    }
    var vue = new Vue({
        el: '#d1',
        data: {
            name:'刘亦菲'
        },
        methods:{
          handleEvent(name){
              this.name=name
          }
        },
        components: {
            add
        }

    })
</script>
</html>

5、ref属性

ref 属性,vue定义的
可以放在普通标签上,通过this, r e f s . 自定义的名字取到的是,原生的 d o m 对象 − − 使用原生 d o m 操作了(不推荐)可以放在组件上:通过 ‘ t h i s . refs.自定义的名字取到的是,原生的dom对象--使用原生dom操作了(不推荐) 可以放在组件上:通过`this. refs.自定义的名字取到的是,原生的dom对象使用原生dom操作了(不推荐)可以放在组件上:通过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="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>

6、动态组件

点击不同的标签 显示不同组件

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

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

8、插槽

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

9、vue-cli

vue 的脚手架:快速帮我们创建除vue的项目

vue2 和vue3
vue-cli可以创建vue2和vue的项目 webpack构建工具
vite:新一代工具构建工具
vue3上,推荐使用ts写js

**先安装nodejs **
-官网:https://nodejs.org/zh-cn/download/ ,下载
安装完会释放两个命令(在环境变量中,任意路径都能敲这俩命令)

安装vue-cli,通过脚手架创建vue项目
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

运行vue项
方式一:在命令行中敲:npm run serve

你可能感兴趣的:(vue,vue.js)