其他分享
首页 > 其他分享> > Vue 04——计算属性与监听属性、局部和全局组件、父子组件通信、ref属性、数据总线、动态组件

Vue 04——计算属性与监听属性、局部和全局组件、父子组件通信、ref属性、数据总线、动态组件

作者:互联网

目录

计算属性和监听属性

计算属性

1 computed 对象写函数,函数就可以当属性使用
2 计算属性只有在它的相关依赖发生改变时才会重新求值

监听属性

1 watch对象中写函数---》函数名就是data中得变量名,只要这个变量发生变化,就会触发该函数的执行
点击查看代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <meta name="viewport" content="width=device-width,initial-scale=1">

    <script src="js/vue.js"></script>
</head>
<body>
<div id="app">
    <input type="text" v-model="myText"> ----->{{myText.substr(0, 1).toUpperCase() + myText.substr(1)}}
    <hr>
    <input type="text" v-model="myText2"> ----->{{getText()}}
    <hr>
    <input type="text" v-model="myText3"> ----->{{getText2}}
    <hr>
    <hr>
    <hr>
    <hr>
    <h1>重写过滤</h1>
    <input type="text" v-model="myText4">
    <hr>
    <p v-for="item in newList">{{item}}</p>
    <hr>
    <hr>
    <hr>
    <h1>监听属性</h1>
    <input type="text" v-model="myText5">----->{{myText5}}




</div>


</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            myText: '',
            myText2: '',
            myText3: '',
            myText4: '',
            dataList: ['a', 'ab', 'abc', 'aa', 'aaa', 'abaaa'],
            myText5: ''

        },
        methods: {
            getText() {
                return this.myText2.substr(0, 1).toUpperCase() + this.myText2.substr(1)
            }
        },
        computed: {  // 计算属性
            getText2() {
                return this.myText3.substr(0, 1).toUpperCase() + this.myText3.substr(1)
            },

            newList() {
                return this.dataList.filter(item => {
                    return item.indexOf(this.myText4) >= 0
                })
            }
        },
        watch: {    // 监听属性 watch对象中写函数---》函数名就是data中得变量名,只要这个变量发生变化,就会触发该函数的执行
            myText5(val){
                console.log('执行了', val)
            }
        }
    })

</script>

</html>

组件化开发之局部和全局组件

# 组件是什么?有什么用
扩展 HTML 元素,封装可重用的代码,目的是复用
	-例如:有一个轮播,可以在很多页面中使用,一个轮播有js,css,html
	-组件把js,css,html放到一起,有逻辑,有样式,有html
点击查看代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <meta name="viewport" content="width=device-width,initial-scale=1">

    <script src="js/vue.js"></script>
</head>
<body>
<div id="app">
    <Child></Child>
</div>


</body>
<script>
    // 定义全局组件
    Vue.component('Child', {
        template: `
          <div>
          <h1>我是一个组件--{{ myText }}</h1>
          <button @click="handleClick">点我看美女</button>
          <br>
          <input type="text" v-model="myText">
          <bigSon></bigSon>
          </div>`,
        data() {
            return {
                myText: '',
            }
        },
        methods: {
            handleClick() {
                alert('打咩哟打咩打咩')
            }
        },  
        
        // 局部组件,写在Vue实力或者组件实例中
        // Child的子组件
        components: {
            bigSon: {
                template: `
                    <div>
                        <h1>我是全局Child的好大儿bigSon</h1>
                    </div>
                `
            }
        }
    })


    var vm = new Vue({
        el: '#app',
        data: {
            myText: '',
        },
        methods: {}
    })

</script>

</html>

组件间通信之父传子(自定义属性)

只能相对的父子之间传 不能子孙传
点击查看代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <meta name="viewport" content="width=device-width,initial-scale=1">

    <script src="js/vue.js"></script>
</head>
<body>
<div id="app">
    <Child :myname="name"></Child>
    <hr>
    <hr>
    <hr>
    <hr>
    <jubu :myname="name"></jubu>
</div>


</body>
<script>
    // 定义全局组件
    Vue.component('Child', {
        template: `
          <div>
          <h1>我是全局组件Child----  {{myname}}---来自实例 实例就是我爹 </h1>
          <bigSon :myname="name" :myage="age"></bigSon>
          </div>`,
        data(){
            return{
                age: 18
            }
        },
        components: {
            bigSon: {
                template: `
                    <div>
                        <h1>我是全局Child的好大儿bigSon  {{myname}}----来自实例 实例是我爷  </h1>     <!--不可行-->
                        <h1>我是全局Child的好大儿bigSon  {{myage}}----来自Child Child就是我爹  </h1>
                    </div>
                    <hr>
                `,
                props: ['myname','myage']
            }
        },
        props:['myname',]
    })


    var vm = new Vue({
        el: '#app',
        data: {
            myText: '',
            name: 'little chicky chicky'

        },
        components: {
            jubu: {
                template: `
                    <div>
                        <h1>我是局部组件jubu------{{myname}}----来自实例 实例也是我爹</h1>
                      <jubuSon :myname="name" :mysex="sex"> </jubuSon>
                    </div>
                    <hr>
                `,
                data(){
                  return  {
                      sex: '男'
                  }
                },
                props:['myname',],
                components: {
                    jubuSon: {
                        template: `
                            <div>
                                <h1>我是局部组件jubu的儿子------{{myname}}----来自实例 实例是我爷</h1>   <!--不可行-->
                                <h1>我是局部组件jubu的儿子------{{mysex}}----来自jubu jubu是我爹</h1>
                            </div>
                            <hr>
                `,
                        props:['myname', 'mysex'],
                    }
                }
            }
        }
    })

</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>
    名字:<input type="text" v-model="name">
    <br>
    年龄:<input type="text" v-model.number="age">


    <h1>子组件中显示</h1>
    <hr>
    <Child :myname="name" :myage="age"></Child>

</div>
</body>

<script>

    //全局组件
    Vue.component('Child', {
        template: `
          <div>
          名字是:{{ myname }}
          <br>
          年龄是:{{ myage }}
          </div>`,
        // props:['myname',]
        props: {
            'myname': String,
            myage: Number
        }
    })


    // 局部组件只能在局部使用
    var vm = new Vue({
        el: '#app',
        data: {
            name: 'lqz',
            age:19
        },
    })

</script>
</html>

组件间通信之子传父(自定义事件)

点击查看代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <meta name="viewport" content="width=device-width,initial-scale=1">

    <script src="js/vue.js"></script>
</head>
<body>
<div id="app">
    <h1>子组件中myText的数据是---{{name}}</h1>
    <hr>
    <Child @myevent="handleEvent"></Child>

</div>


</body>
<script>
    // 定义全局组件
    Vue.component('Child', {
        template: `
          <div>
          <input type="text" v-model="myText">
          <button @click="handleClick">点我把数据传给咱爹</button>
          <br>

          </div>`,
        data() {
            return {
                myText: '',
            }
        },
        methods: {
            handleClick(){      // 触发自定义事件myevent  然后传参 有几个传几个给myevent绑定的函数handleEvent 并执行
                this.$emit('myevent', this.myText)
            }
        }
    })

    var vm = new Vue({
        el: '#app',
        data: {
            name: ''
        },
        methods: {
            handleEvent(myText) {
                alert('爸爸收到啦 乖儿子')
                this.name = myText
            }
        }
    })

</script>

</html>

ref属性

# ref 属性是什么
ref放在普通标签上,拿到的是原生节点,原生dom操作
ref放在组件上,拿到的是组件对象,
	通过这种方式实现子传父(this.$refs.mychild.text)
  	通过这种方式实现父传子(调用子组件方法传参数)
    
<p ref='pp'></p>
<Child ref='cc'></Child>

普通标签

点击查看代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/vue.js"></script>
</head>
<body>
<div id="app">
    <p ref="impp">我是pp</p>
    <br>
    <button @click="handleClick">click me</button>
    <br>
</div>
</body>

<script>    
    var vm = new Vue({
        el: '#app',
        data: {},
        methods: {
            handleClick() {
                console.log(this.$refs)     
                this.$refs['impp'].innerText='你喜欢pp吗'
            }
        }
    })
</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">
    <Child ref="xdxe"></Child>
    <br>  
    <button @click="handleClick">click me</button>  
    <br>      
    <p>sex是:{{sex}}</p>
</div>
</body>
<script>
    // 定义全局组件
    Vue.component('Child', {
        template: `
          <div>
          <h1>我是组件</h1>
          名字:{{name}}
          <br>
          年龄:{{age}}
          </div>`,
        data() {
            return {
                name: '熊大熊二',
                age: 10,
                sex: 'male'
            }
        },
        methods: {
            handleClick(){
                console.log(this.name, this.age)
            }
        }
    })

    var vm = new Vue({
        el: '#app',
        data: {
            sex: ''
        },
        methods: {
            handleClick() {
                console.log(this.$refs)     
                alert(this.$refs['xdxe'].name)
                alert(this.$refs['xdxe'].age)
                this.$refs['xdxe'].handleClick()  // 调用子组件的方法

                this.sex = this.$refs['xdxe'].sex  // 获取子组件属性


            }
        }

    })

</script>

</html>

数据总线

# 不同层级的不同组件通信
    -数据总线
    -vuex--->状态管理器---》
    -cookie,localStorage,sessionStorage
点击查看代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/vue.js"></script>
</head>
<body>
<div id="app">
    <child1></child1>
    <hr>
    <child2></child2>
</div>


</body>
<script>
    // 定义一个数据总线 本质就是一个vue对象
    var bus = new Vue()  // new一个vue的实例 九四中央事件总线
    
    // 组件1
    Vue.component('child1', {
        template: `
          <div>
          <input type="text" v-model="myText">    <!--1. 输入text-->
          <button @click="handleClick">点我</button>      <!--2. 点击触发函数-->
          </div>`,
        data() {
            return {
                myText: ''
            }
        },
        methods: {
            handleClick(){
                bus.$emit('prpr', this.myText)      // 3.触发prpr 同时传参this.myText
            }
        }
    })
    
    // 组件2
    Vue.component('child2', {
        template: `
              <div>
              接受到的数据是:{{ myText }}
              </div>`,
        data() {
            return {
                myText: ''
            }
        },
        mounted() {
            // 监听 被触发后执行
            bus.$on('prpr', (name)=>{           // 4.监听 触发了prpr 执行函数
                this.myText=name
            })
        }
    })

    var vm = new Vue({
        el: '#app',
        data: {},
    })
    
</script>

</html>

动态组件

# 通过component配合is属性,决定显示的组件是哪个
# keep-alive 保证组件切换走后不被销毁
<keep-alive>
    <component :is="who">

    </component>
</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">
<!--# 通过component配合is属性,决定显示的组件是哪个-->
<!--# keep-alive 保证组件切换走后不被销毁-->
    <button @click="who='home'">首页</button>
    <button @click="who='goods'">商品</button>
    <button @click="who='order'">订单</button>
    <keep-alive>
        <component :is="who">

        </component>
    </keep-alive>

</div>
</body>
<script>
    Vue.component('home', {
        template: `
          <div>
          首页
          </div>`,
    })
    Vue.component('goods', {
        template: `
          <div>
          商品
          <input type="text">
          </div>`,
    })
    Vue.component('order', {
        template: `
          <div>
          订单
          </div>`,
    })
    
    var vm = new Vue({
        el: '#app',
        data: {
            who: 'home'
        },
    })
</script>
</html>

slot插槽

点击查看代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/vue.js"></script>
</head>
<body>
<div id="app">
<home>          <!--在home里插-->
    <div><button>美女</button></div>
    <div slot="aa">我指定插到aa这</div>
</home>
</div>
</body>
<script>
    Vue.component('home', {
        template: `
          <div>
          <input type="text">
          <hr>
          <p>没指定的默认插这:</p>
          <slot></slot>

          <hr>
          <p>指定aa的插这:</p>
          <slot name="aa"></slot>
          <hr>
          <button>点我</button>
          </div>`,
    })

    var vm = new Vue({
        el: '#app',
        data: {
        },
    })

</script>
</html>

标签:Vue,myText,template,组件,data,属性
来源: https://www.cnblogs.com/run-fast-hit-fast-win-fast/p/16424733.html