4-vue组件

# 1 radio:
	-多个radio使用同一个变量,v-model绑定的值就是value的值
	-只有一个radio,v-model绑定的值就是true或false
# 2 checkbox:
	-多个checkbox使用同一个变量,v-model绑定的值就是value值的数组
    -只有一个checkbox,v-model绑定的值就是true或false
    
# 3 基本的购物车案例
	-{{getPrice()}} 只要数据一变化,就会执行---》页面变了,会重新加载
    -js的for循环:基于迭代和基于索引---》python只有基于迭代的
    
# 4 购物车带全选全不选
	-又加了一个checkbox,使用的变量是自己的
    -给全选全不选的checkbox绑定了一个 change事件
    -给单个绑定了一个change事件
    
# 5 购物车带加减

#6 v-model进阶:lazy,number,trim
# 7 生命周期钩子函数
	-8个
    -created
    -mounted
    -setTimeout
    -setInterval
    
# 8 前后端交互
	-ajax:jq的ajax,fetch,axios

1 计算属性

# 把原来的函数,做成属性,只要原来函数中相关的值变化,属性才重新运算,提高效率

关键字:computed

1.1首字母大写

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./js/vue.js"></script>
</head>
<body>
<div class="app">
    请输入名字:<input type="text" v-model="myName">
    <br>
    <p>使用函数:{{upperName()}}</p>
    <p>使用计算属性:{{getName}}</p>


</div>

</body>
<script>
    var vm = new Vue({
        el: '.app',
        data: {
            myName:''
        },
        methods:{
            upperName(){
                return this.myName.substring(0,1).toUpperCase()+this.myName.substring(1)
            }
        },
        computed:{
            // getName 以后当属性用
            getName(){
                return this.myName.substring(0,1).toUpperCase()+this.myName.substring(1)
            }
        }
    })
</script>
</html>

1.2重写过滤

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./js/vue.js"></script>
</head>
<body>
<div class="app">
    <input type="text" v-model="myText">
    <br>
    <ul>
        <li v-for="data in newdataList">{{data}}</li>
    </ul>


</div>

</body>
<script>
    var vm = new Vue({
        el: '.app',
        data: {
            myText:'',
            dataList:['a','abc','abandon','c','curd','d','dog','doc']
        },
        computed:{
            newdataList(){
                return this.dataList.filter(item=>{
                    return item.indexOf(this.myText)>-1
                })
            }
        }

    })
</script>
</html>

2 组件化开发之定义局部组件

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


# 局部组件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.js"></script>
</head>
<div id="app">
# 局部组件(components)
    <child></child>

</div>


<body>
<script>
    var vm = new Vue({
        el:'#app',
        data:{},
        components:{
            'child':{
                	# 注意:自定义组件需要有一个root element,一般包裹在一个div中
                     template:`
                     <div>
                        <h2>{{name}}</h2>
                        <hr>
                        <button @click="handclick">点我要你好看</button>
                     </div>`,
                	# 注意:组件里的data必须是函数
                     data(){
                         return {
                             name:'lhs'
                         }
                     },
                     methods:{
                         handclick() {
                             alert('点到你了')
                         }
                     }
            }

        }
    })

</script>
</body>
</html>



# 总结
1 自定义组件需要有一个root element,一般包裹在一个div中
2 父子组件的data是无法共享
3 组件可以有data,methods,computed....,但是data 必须是一个函数


3 组件化开发之定义全局组件

# Vue.component

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.js"></script>
</head>
<div id="app">
    <child></child>
    <hr>
    <children></children>

</div>


<body>
<script>
    //全局组件
    Vue.component('children',{
        template: `
        <div>
            <button @click="handclick1">返回</button>
            {{name}}
            <button>主页</button>
        </div>
        `,
        data(){
            return {
                name:'主页'
            }
        },
        methods: {
            handclick1(){
                this.name='返回'
            }
        }
    })
    var vm = new Vue({
        el:'#app',
        data:{},
        // 局部组件
        components:{
            'child':{
                     template:`
                     <div>
                        <h2>{{name}}</h2>
                        <hr>
                        <button @click="handclick">点我要你好看</button>
                     </div>`,
                     data(){
                         return {
                             name:'lhs'
                         }
                     },
                     methods:{
                         handclick() {
                             alert('点到你了')
                         }
                     }
            }

        }
    })

</script>
</body>
</html>

4 组件间通信

1 父子组件传值 (props down, events up)
2 父传子之属性验证props:{name:Number}Number,String,Boolean,Array,Object,Function,null(不限制类型)
3 事件机制a.使用 $on(eventName) 监听事件b.使用 $emit(eventName) 触发事件
4 Ref<input ref="mytext"/>  this.$refs.mytext
5 事件总线var bus = new Vue();* mounted生命周期中进行监听

4.1组件间通信之父传子

# 通过自定义属性实现

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

    <input type="text" v-model="myText">---->{{myText}}
    
  # 自定义属性
    <children :mytext="myText" :toast="true" aa="true"></children>
# 注: :toast="true"是布尔类型 aa="true"是一个字符串
</div>


</body>
<script>

    var vm = new Vue({
        el: '.app',
        data: {
            myText: ''
        },
        components: {
            'children': {
                template: `
                    <div>
                        <h3 style="background: red">{{mytext}}</h3>
                        <h2>{{toast}}</h2>
                        <hr>
                        <button @click="handleClick">点我看美女</button>
                    </div>
                `,
                data() {
                    return {}
                },
                created() {
                    console.log("我创建了")
                },
                methods: {
                    handleClick() {
                        alert(this.mytext)
                    }
                },
                # props可是是数组也可以是一个对象
                props: ['mytext','toast'] // 数组中写自定义属性的名字,在data中不需要再写mytext
    
                },
            }
        },


    })
</script>
</html>

4.2 属性认证

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

    <input type="text" v-model="myText">---->{{myText}}

    <children :mytext="myText" :toast="true" aa="true"></children>
</div>


</body>
<script>

    var vm = new Vue({
        el: '.app',
        data: {
            myText: ''
        },
        components: {
            'children': {
                template: `
                    <div>
                        <h3 style="background: red">{{mytext}}</h3>
                        <h2>{{toast}}</h2>
                        <hr>
                        <button @click="handleClick">点我看美女</button>
                    </div>
                `,
                data() {
                    return {}
                },
                created() {
                    console.log("我创建了")
                },
                methods: {
                    handleClick() {
                        alert(this.mytext)
                    }
                },
                // props: ['mytext','toast'] // 数组中写自定义属性的名字,在data中不需要再写mytext
                props: {
                    mytext: String, // myText必须是字符串
                    toast: Boolean, // 必须是布尔
                },
            }
        },


    })
</script>
</html>

5 组件间通信之子传父

# 通过自定义事件传递
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./js/vue.js"></script>
</head>
<body>
<div class="app">
    <child @han="handleClick"></child>
    <hr>
    {{myText}}

</div>


</body>
<script>

    Vue.component('child', {
        template: `
            <div>
                <button>返回</button>
                <span>{{name}}</span>
                <button @click="handleC">把name传到父组件</button>
            </div>
        `,
        data() {
            return {
                name: '我是子组件的name'
            }
        },
        methods: {
            handleC() {
                // 会触发该组件身上的han事件对应的函数执行,参数依次传入
                this.$emit('han', this.name,'lqz')

            }
        }
    })
    var vm = new Vue({
        el: '.app',
        data: {
            myText: ''
        },
        methods: {
            handleClick(a,b) {
                this.myText = a
                console.log(b)

            }
        }


    })
</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="box">
    普通方式
    <button @click="isShow=!isShow">点击隐藏显示</button>
    <navbar v-show="isShow"></navbar>

    <hr>
    字传父方式
    <mybutton @myevent="handleShow"></mybutton>
    <navbar v-show="isShow"></navbar>
</div>
</body>
<script>
    Vue.component('mybutton', {
        template: `
            <div>
              <button @click="handleClick">点我隐藏显示</button>
            </div>
        `,
        methods: {
            handleClick() {
                this.$emit('myevent')
            }
        }
    })

    Vue.component('navbar', {
        template: `
            <div>
                <ul>
                    <li>111</li>
                    <li>222</li>
                    <li>333</li>
                </ul>
            </div>
        `,
        data() {
            return {
                name: 'lqz'
            }
        },
        methods: {
            handleEvent() {
                // this.$emit('myevent') //myevent:子组件中监听自定义事件
                this.$emit('myevent', 100) //100表示传递的参数
            }
        }
    })
    var vm = new Vue({
        el: '#box',
        data: {
            isShow: true
        },
        methods: {
            handleShow() {
                this.isShow=!this.isShow

            }
        }

    })
</script>
</html>

7ref属性

ref放在标签上,拿到的是原生节点,原生节点的属性,通过 . 获取到了
ref放在组件上,拿到的是组件对象,
	通过这种方式实现子传父(this.$refs.mychild.text)
  	通过这种方式实现父传子(调用子组件方法传参数)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.js"></script>
</head>
<div id="app">
    # <h1>放在普通标签上</h1>
    <input type="text" v-model="mytest" ref="myinput">===>{{mytest}}
    <button @click="handclick" ref="mybutton">点我</button>
    <hr>
    # <h1>放在组件上</h1>
    <button @click="handclick1">点我看帅哥</button>
    <children ref="mychild"></children>

</div>
<body>

<script>
    Vue.component('children',{
        template:`
        <div>
            <button>前进</button>
            {{name}}
            <button>后退</button>

        </div>
        `,
        data(){
            return {
                name:'主页'
            }
        },
    })
    var vm = new Vue({
        el:'#app',
        data:{
            mytest:''
        },
        methods:{
            handclick(){
                console.log(this.$refs)
                console.log(this.$refs.myinput)
                console.log(this.$refs.myinput.value)
            },
            handclick1(){
                this.$refs.mychild.name='帅哥'
            }
        }

    })
</script>

</body>
</html>

8 动态组件

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

    <ul>
        <li @click="who='home'">首页</li>
        <li @click="who='shopping'">购物</li>
        <li @click="who='my'">我的</li>
    </ul>
    <keep-alive>
        <component :is="who"></component>
    </keep-alive>


</div>


</body>
<script>


    Vue.component('home', {
        template: `
            <div>
                我是:{{name}}
            </div>`,
        data() {
            return {
                name: '首页'
            }
        }
    })

    Vue.component('shopping', {
        template: `
            <div>
                我是:{{name}}
                <br>
                购买的商品:<input type="text" v-model="list">--->{{list}}
            </div>`,
        data() {
            return {
                name: '购物',
                list: ''
            }
        }
    })

    Vue.component('my', {
        template: `
            <div>
                我是:{{name}}
            </div>`,
        data() {
            return {
                name: '我的'
            }
        }
    })

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


    })


</script>
</html>
posted @ 2022-02-15 20:51  一叶松  阅读(40)  评论(0编辑  收藏  举报