Vue组件

3 篇文章 0 订阅


1.Vue基础回顾

1.1 基本使用

1.1.1 Vue的基本使用

1)使用PyCharm新建空白项目vue,在vue目录下新建src目录,并将提供的vue.js和axios.js放到src目录下。

2)在vue目录下新建01-vue基本使用的.html,并在其中编写以下内容。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue基本使用</title>
    <script src="./src/vue.js"></script>
</head>
<body>
    <div id="app">
        <!-- 使用数据 -->
        {{ name }}
    </div>
</body>
<script>
    // 创建Vue对象
    var vm = new Vue({
        // 接管app对应的div区域
        el: "#app",
        data: {
            // 定义数据
            name: "itcast"
        }
    });
</script>
</html>

1.1.2 methods方法的定义与使用

1)修改01-vue基本使用的.html文件,在vue中定义methods方法change_name。

<script>
    // 创建Vue对象
    var vm = new Vue({
        // 接管app对应的div区域
        el: "#app",
        data: {
            // 定义数据
            name: "itcast"
        },
        methods: {
            // 定义方法
            change_name: function () {
                // 修改name变量数据
                this.name = 'itheima';
            }
        }
    });
</script>

2)修改01-vue基本使用的.html文件,在其中添加button按钮并绑定click事件时调用change_name方法。

<body>
    <div id="app">
        <!-- 使用数据 -->
        {{ name }}
        <input type="button" @click="change_name" value="改变name">
    </div>
</body>

1.2 axios请求

1.2.1. axios请求的基本使用

在vue中,可以使用axios发起异步请求。

axios.get(url[, config])
axios.post(url[, data[, config]])
axios.put(url[, data[, config]])
axios.delete(url[, config])

以get请求为例:

axios.get(url[, config]).then(response => {
  // 请求成功执行的代码
}).catch(error => {
  // 请求失败时执行的代码
})
1.2.2. 案例(Vue获取所有图书的数据并展示)

1)在vue目录下新建02-axios请求.html,并在其他编写以下内容。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>axios基本使用</title>
    <script src="./src/vue.js"></script>
    <script src="./src/axios.js"></script>
</head>
<body>
    <div id="app">
        <input type="button" value="获取所有图书数据" @click="show_books">
    </div>
</body>
<script>
    // 创建Vue对象
    var vm = new Vue({
        // 接管app对应的div区域
        el: "#app",
        data: {
            // 定义数据
            books: []
        },
        methods: {
            // 定义方法
            show_books: function () {

            }
        }
    })
</script>
</html>

2)在show_books.html文件中编写show_books方法的内容,使用axios访问DRF框架编写的/books/接口来获取数据。

<script>
    // 创建Vue对象
    var vm = new Vue({
        // 接管app对应的div区域
        el: "#app",
        data: {
            // 定义数据
            books: []
        },
        methods: {
            // 定义方法
            show_books: function () {
                axios.get('http://127.0.0.1:8000/books/')
                .then(response => {
                    // 请求成功:通过`response.data`可以获取API接口的响应数据
                    this.books = response.data;

                }).catch(error => {
                    // 请求失败:通过`error.response.data`可以获取API接口响应的错误信息
                    console.log(error.response.data);
                })
            }
        }
    })
</script>

3)修改show_books.html文件内容,使用v-for遍历展示所有图书的数据。

<body>
    <div id="app">
        <input type="button" value="获取所有图书数据" @click="show_books">
        <table>
            <tr v-for="book in books">
                <td>{{ book.id }}</td>
                <td>{{ book.btitle }}</td>
                <td>{{ book.bpub_date }}</td>
                <td>{{ book.bread }}</td>
                <td>{{ book.bcomment }}</td>
            </tr>
        </table>
    </div>
</body>

注:GET /books/接口直接使用DRF框架所讲的图书管理案例项目运行即可,但是默认点击获取所有图书数据按钮时,会有以下错误:
在这里插入图片描述

这是CORS跨域请求错误,在美多商城后台项目中会进行详细讲解,此处按如下方式解决此错误即可:

1)安装django-cors-headers扩展包

pip install django-cors-headers

2)在MIDDLEWARE中间件配置中注册中间件。

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware', # 此处为注册的中间件
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

3)在settings.py中进行如下配置。

CORS_ORIGIN_ALLOW_ALL=True
CORS_ALLOW_CREDENTIALS = True  # 允许携带cookie

4)再次点击获取所有图书数据按钮,结果如下:
在这里插入图片描述


2.Vue组件


2.1 基本使用

  1. Vue组件的基本使用

vue的组件分为全局注册组件和局部注册组件。

1.1 全局注册组件
1)在vue目录下新建03-vue组件(全局注册).html文件,编写以下内容。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue组件(全局注册)</title>
    <script src="./src/vue.js"></script>
</head>
<body>
    <div id="app">

    </div>
</body>
<script>
    // 创建Vue对象
    var vm = new Vue({
        // 接管app对应的div区域
        el: "#app"
    })
</script>
</html>

2)在03-vue组件(全局注册).html文件中全局注册一个Vue组件并使用。

<body>
    <div id="app">
        <!-- 使用组件时,直接将组件名当做标签使用即可 -->
        <login></login>
    </div>
</body>
<script>
    // 定义组件并注册
    Vue.component('login', {
        // login组件的模板内容
        template: '<div>登录组件内容</div>'
    });

    // 创建Vue对象
    var vm = new Vue({
        // 接管app对应的div区域
        el: "#app"
    })
</script>

3)在浏览器中查看03-vue组件(全局注册).html,显示内容如下:
在这里插入图片描述

注:使用Vue.component创建的组件是全局注册的,它们在注册之后可以用在任何新创建的 Vue 根实例 (new Vue) 的模板中。

2. 局部注册组件
1)在vue目录下新建04-vue组件(局部注册).html文件,编写以下内容。

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

    </div>
</body>
<script>
    // 创建Vue对象
    var vm = new Vue({
        // 接管app对应的div区域
        el: "#app"
    })
</script>
</html>

2)在04-vue组件(局部注册).html定义一个Vue组件并进行局部注册。

<body>
    <div id="app">
        <!-- 使用组件 -->
        <login></login>
    </div>
</body>
<script>
    // 定义login组件
    var login = {
        // 定义组件的模板内容
        template: '<div>登录组件内容</div>'
    };

    // 创建Vue对象
    var vm = new Vue({
        // 接管app对应的div区域
        el: "#app",
        components: {
            // 组件名: 组件
            'login': login
        }
    })
</script>

3)在浏览器中查看03-vue组件(全局注册).html,显示内容如下:
在这里插入图片描述

注:局部注册的组件在其子组件中不可用。

2.2 组件data属性

一个组件的 data 选项必须是一个函数。

1)在vue目录下新建05-组件的data属性.html文件,编写以下内容。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>组件的data属性</title>
    <script src="./src/vue.js"></script>
</head>
<body>
    <div id="app">

    </div>
</body>
<script>
    // 创建Vue对象
    var vue = new Vue({
        // 接管app对应的div区域
        el: "#app"
    })
</script>
</html>

2)在05-组件的data属性.html文件中定义注册组件component_a并使用。

<body>
    <div id="app">
        <!-- 使用组件 -->
        <component-a></component-a>
    </div>
</body>
<script>
    // 创建component_a组件
    var component_a = {
        template: "<div>组件内容:{{ count }}</div>",
        // 组件的data选项必须是一个函数
        data: function () {
            // 返回一个字典,字典中包含定义的各个参数
            return {
                count: 1
            }
        }
    };

    // 创建Vue对象
    var vue = new Vue({
        // 结果app对应的div区域
        el: "#app",
        components: {
            // 组件名:组件
            'component-a': component_a
        }
    })
</script>

3)在浏览器中查看05-组件的data属性.html,显示内容如下:
在这里插入图片描述


2.3 父子组件

  1. 父组件和子组件
    1)在vue目录下新建06-父子组件.html文件,编写以下内容。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>父子组件</title>
    <script src="./src/vue.js"></script>
</head>
<body>
    <div id="app">

    </div>
</body>
<script>
    // 创建Vue对象
    var vue = new Vue({
        // 接管app对象对应的div区域
        el: "#app"
    })
</script>
</html>

2)在06-父子组件.html文件中定义注册两个组件:父组件parent,子组件child。

<body>
    <div id="app">
        <!-- 使用组件 -->
        <parent></parent>
    </div>
</body>
<script>
    // 子组件
    var child = {
        template: "<div>子组件</div>"
    };

    // 父组件
    Vue.component("parent", {
        template: "<div>父组件<child></child></div>",
        data: function () {
            return {
                count: 1
            }
        },
        components: {
            // child组件是parent组件的子组件
            "child": child
        }
    });


    // 创建Vue对象
    var vue = new Vue({
        // 接管app对象对应的div区域
        el: "#app"
    })
</script>

3)在浏览器中查看06-父子组件.html页面,效果如下:
在这里插入图片描述


  1. 父子组件之间的传值

2.1 父组件向子组件传值-props属性

1)拷贝06-父子组件.html页面,修改名称为07-父组件向子组件传值.html。

2)在07-父组件向子组件传值.html中编写以下代码,让父组件parent将其data中的count数据传递给child子组件并在child子组件中进行使用。

<script>
    // 子组件
    var child = {
        template: "<div>子组件:{{ num }}</div>",
        props: ['num'] // 用于接收父组件传递的值
    };

    // 父组件
    Vue.component("parent", {
        // <child :num='count'></child>:表示在使用子组件时,将父组件中count数据的值传递给子组件的num
        template: "<div>父组件<child :num='count'></child></div>",
        data: function () {
            return {
                count: 1
            }
        },
        components: {
            // child组件是parent组件的子组件
            "child": child
        }
    });


    // 创建Vue对象
    var vue = new Vue({
        // 接管app对象对应的div区域
        el: "#app"
    })
</script>

3)在浏览器中查看07-父组件向子组件传递.html,效果如下:
在这里插入图片描述


2.2 子组件向父组件传递-$emit

1)拷贝06-父子组件.html页面,修改名称为08-子组件向父组件传值.html。

2)在08-子组件向父组件传值.html中编写以下代码,让child子组件传递数据给父组件parent。

<script>
    // 子组件
    var child = {
        // 2. 点击子组件的a标签,触发send_data向父组件传值
        template: "<div>子组件<br/><a href='#' @click='send_data'>传值给父组件</a></div>",
        methods: {
            send_data: function () {
                // 1. 调用$emit('事件名', '传递的值')将值传递给父组件
                this.$emit('send', 'hello')
            }
        }

    };

    // 父组件
    Vue.component("parent", {
        template: "<div>父组件<child v-on:send='receive_data'></child></div>",
        data: function () {
            return {
                count: 1
            }
        },
        components: {
            // child组件是parent组件的子组件
            "child": child
        },
        methods: {
            // 3. 定义receive_data用于获取子组件传递的数据
            'receive_data': function (input) {
                // input即为子组件传递的数据
                alert(input);
            }
        }
    });


    // 创建Vue对象
    var vue = new Vue({
        // 接管app对象对应的div区域
        el: "#app"
    })
</script>

3)在浏览器中查看08-子组件向父组件传值.html,点击传值给父组件a标签,效果如下:
在这里插入图片描述


3.单文件组件

将一个组件相关的html结构,css样式,以及交互的JavaScript代码从html文件中剥离出来,合成一个文件,这种文件就是单文件组件,相当于一个组件具有了结构、表现和行为的完整功能,方便组件之间随意组合以及组件的重用,这种文件的扩展名为“.vue”,比如:“Hello.vue”。

// 使用template标签来定义html部分
<template>
    <p>{{ greeting }} World!</p>
</template>

// javascript要写成模块导出的形式:
<script>
    export default{
        data:function(){
            return {
                greeting: 'Hello'                
            }
        }
    }
</script>

// 样式中如果有scope关键字,表示这些样式是组件局部的,不会影响其他元素
<style scoped>
p {
  font-size: 2em;
  text-align: center;
}
</style>

4.Vue-cli的使用

我们的项目文件都是手动创建出来,在实际开发中我们可以借助vue-cli创建出所有的项目文件。

  1. 基本使用

1)在终端全局安装vue-cli。

npm install --global vue-cli

2)使用vue-cli创建一个前端项目。

vue init webpack 项目名
如:
vue init webpack meiduo_mall_admin

创建出的项目目录结构如下:
在这里插入图片描述

  • src:主开发目录,要开发的单文件组件全部在这个目录下
  • static:静态资源目录,所有的css,js文件放在这个文件夹
  • components:组件目录,vue格式的单文件组件都存在这个目录中
  • router:路由目录,在此文件夹中配置组件路由
还有node_modules目录是node的包目录,config是配置目录,build是项目打包时依赖的目录。

3)运行调试项目。

// 进入项目目录下,执行下面指令
npm run dev

效果如下:
在这里插入图片描述

4)通过浏览器访问http://localhost:8080,效果如下:
在这里插入图片描述


  1. Vue单文件组件项目页面结构说明

在这里插入图片描述

整个项目是一个主文件index.html,index.html中会引入src文件夹中的main.js,main.js中会导入顶级单文件组件App.vue,App.vue中会通过组件嵌套或者路由来引用components文件夹中的其他单文件组件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值