“Vue2.0”跟俺一起全面入坑 03

书接上文

一、 自定义指令

除了Vue内置的指令,可以自己设置指令。

1. 注册全局指令—所有人都可以用
<body>
      <div class="app">
        <div v-color="colorStatus">我是一个普通的div元素</div>
      </div>
    <script src="./node_modules/vue/dist/vue.js" charset="utf-8"></script>
    <script type="text/javascript">
      document.addEventListener('DOMContentLoaded',function () {
          Vue.directive('color',function (el,binding) {//指令名称注意不要加**v-**
              console.log(el);//当前绑定自定义指令的元素,可以用来直接操作DOM
              console.log(binding);//一些参数,常用的  => binding.value(指令的值) 
              el.style.backgroundColor = 'lawngreen';
          })
        var vm = new Vue({
            el: '.app',
            data: {
                colorStatus: true
            }
        });
      },false);
    </script>
  </body>
2. 注册局部指令—当前组件下可用

选项对象的directives属性(注意此处有个s)

<body>
      <div class="app">
        <div v-color="colorStatus">我是一个普通的div元素</div>
      </div>
    <script src="./node_modules/vue/dist/vue.js" charset="utf-8"></script>
    <script type="text/javascript">
      document.addEventListener('DOMContentLoaded',function () {
        var vm = new Vue({
            el: '.app',
            data: {
                colorStatus: true
            },
            directives:{
                'color':function (el,binding) {
                    el.style.backgroundColor = 'lawngreen';
                }
            }
        });
      },false);
    </script>
  </body>

二、 计算数据(计算属性)—— 在选项对象中定义

为什么要使用计算属性
模版是未来描述视图的结构,在模版中放入太多逻辑,导致模版过重难以维护。
在计算一个计算属性时,Vue.js更新它的依赖列表并缓存结果,只有当其中一个依赖发生了变化,缓存的结果才无效。

<body>
    <div class="app">
        <input type="button" value="改变" @click="change" />
        {{ myData }}
    </div>
<script src="vue.js"></script>
<script>
    var vm = new Vue({
        el: '.app',
        data:{
            num: 1
        },
        computed: {
            myData:{
                get:function(){
                    alert('get');
                    return this.num + 2;
                },
                set:function(val){
                    alert('set');
                    return this.num=val;
                }
            }
        },
        methods: {
            change() {
                //vm.myData=10;
                this.myData=10;//此处虽然设置了myData的值,但是结果是12,因为myData是依赖num的
            }
        }
    });
</script>
</body>

解析:计算属性和数据使用的方式一样。页面加载的时候后触发get函数,当点击事件后会触发set函数。

三、组件化开发

1. 什么是组件
WEB中的组件其实就是页面组成的一部分,好比是电脑中的每一个原件(如硬盘、键盘、鼠标),它是一个具有独立的逻辑和功能或页面,同时又能根据规定的接口规则进行相互融合,变成一个完整的应用。
2. 使用组件的好处

提高效率    |   方便重复使用   |   简化调试步骤
提升整个项目的课维护性   |   便于协同开发

3. 组件的特性:

1、高内聚性,组件功能必须是完整的,如我要实现下拉菜单功能,那在下拉菜单这个组件中,就把下拉菜单所需要的所有功能全部实现;

2、低耦合性,通俗点说,代码独立不会和项目中的其他代码发生冲突!在实际工程中,我们经常会涉及到团队协作,传统按照业务线去编写代码的方式,就很容易相互冲突,所以运用组件化方式就可大大避免这种冲突的存在。

3、每一个组件都有自己清晰的职责,完整的功能,较低的耦合便于单元测试和重复利用;
4. Vue中的组件

vue中的组件
vue中的组件是一个自定义标签(元素),Vue.js的编译器为它添加特殊功能;vue也可以拓展原生的html元素,封装可重用的代码
组件的基本组成

  样式结构   |   行为逻辑   |   数据

**a). **全局注册

<body>
    <div class="app">
        <my-component></my-component>
    </div>
<script src="vue.js"></script>
<script>
    //全局注册
    Vue.component('myComponent',{//html中是横杠的,在js中就是驼峰
        template: `<h2>我是全局组件</h2>`
    })
    var vm = new Vue({
        el: '.app'
    });
</script>
</body>

**b). **局部注册

<body>
    <div class="app">
        <my-component></my-component>
        <common></common>
    </div>
<script src="vue.js"></script>
<script>
    var Child = {
        template:`<h3>我是局部组件</h3>`
    };
    var common = {
        template: `<p>第二个局部组件</p>`
    }
    var vm = new Vue({
        el: '.app',
        components: {
            // <my-component> 将只在父模板可用
            myComponent: Child,
            common //如果组件定义的名字和在html显示的标签名一致就可以省略
        }
    });
</script>
</body>

**c). **组件模版编写方式
当我们的组件模版内容较多的时候,不要用字符串的方式了,比较繁琐。可使用在外部定义一个模版然后在组件注册的时候引用一下.

<body>
    <div class="app">
        <my-component></my-component>
        <common></common>
    </div>
    <!-- type="x-template" 是为了不让这个script进行解析  -->
    <!-- 用script标签名的方式 -->
    <script id="component1" type="x-template">
            <h3>第一个局部组件——定义方式1</h3>
    </script>
    <!-- 用 template标签名的方式  推荐-->
    <template id="component2">
        <p>第二个局部组件——定义方式2</p>
    </template>
<script src="vue.js"></script>
<script>
    var Child = {
        template:`#component1`
    };
    var common = {
        template: `#component2`
    }
    var vm = new Vue({
        el: '.app',
        components: {
            // <my-component> 将只在父模板可用
            myComponent: Child,
            common //如果组件定义的名字和在html显示的标签名一致就可以省略
        }
    });
</script>
</body>

**d). **在组件中定义组件(父子组件)
注意:组件中的数据是以函数的形式的,并且有返回值

<body>
    <div class="app">
        <my-component></my-component>
    </div>
    <!-- 用 template标签名的方式  推荐-->
    <template id="myMsg">
        <div>
            <p>父组件 => {{ msg }}</p>
            <child></child>
            <child2></child2>
        </div>
    </template>
<script src="vue.js"></script>
<script>
    var myComponent = {
        template: `#myMsg`,
        data(){  //注意组件中的数据是一个函数的形式并且是有返回值的
            return {
                msg: '我是父组件中的数据'
            }
        },
        components: {
            child: {
                template: `<p>我是第一个子组件</p>`
            },
            child2: {
                template: `<p>我是第二个子组件</p>`
            }
        }
    }
    var vm = new Vue({
        el: '.app',
        components: {
            myComponent
        }
    });
</script>

路由

<body>
    <div class="app">
        <div>
            <router-link to="/home">主页</router-link>
            <router-link to="/news">新闻</router-link>
        </div>
        <div>
            <router-view></router-view>
        </div>
    </div>
    <template id="news">
        <div>
            <h2>我是新闻页面</h2>
            <ul>
                <li>
                    <router-link to="/news/detail/001?a=1">详细新闻</router-link>
                    <router-link to="/news/detail/002">详细新闻2</router-link>
                    <router-link to="/news/detail/003">详细新闻3</router-link>
                </li>
                <div>
                    <router-view></router-view>
                </div>
            </ul>
        </div>
    </template>
    <script>
        //组件
        var Home = {
            template: `<h2>我是主页</h2>`
        };
        var News  = {
            template: `#news`
        };
        var Detail = {
            template: `<p>{{ $route.params }} => {{ $route.query }} => {{ $route.path }}</p>`
        }
        //配置路由
        const routes = [
            {
                path:'/home',
                component: Home
            },
            {
                path:'/news',
                component:News,
                children: [
                    {
                        path:'detail/:id',
                        component: Detail
                    }
                ]
            },
            {
                path:'*',
                redirect:'/home'
            }
        ]
        //生成路由实例
        const router = new VueRouter({
            routes
        });
        //挂在到vue实例上
        const vm = new Vue({
            el: '.app',
            router
        });
    </script>
</body>

未完待续...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容