vue知识-05

news2024/11/19 21:15:50

聊天室案例(django接口)

# chat.hetm
    <<script src="/static/axios.js"></script>
    <script src="/static/vue.js"></script>

<body>
<div id="app">
    <h1>聊天室</h1>
    <button @click="handleShow">打开/关闭聊天室</button>
    <hr>
    <Child v-if="show"></Child>
    <hr>
</div>
</body>
<script>
    Vue.component('Child',{
        template:`
            <div>
                <h3>聊天室来咯</h3>
                <p v-for="item in chatList">{{ item.name }}说:{{ item.content }}</p>
                <hr>
                姓名:<input type="text" v-model="name">
                <input type="text" v-model="content">
                <button @click="handleSend">发送</button>
            </div>`,
        data(){
            return{
                chatList:[
                    {"name":"张三","content":"你好"},
                    {"name":"徐飞飞","content":"早上好"},
                    {"name":"周佳佳","content":"早"},
                ],
                name: '',
                content: ''
            }
        },
        methods:{
            handleSend(){
                axios.get(`http://127.0.0.1:8000/chat/send/?from_user=${this.name}&content=${this.content}`).then(res =>{
                    if (res.data.code == 100) {
                        alert(this.data.msg)
                    } else {
                        alert(this.data.msg)
                    }
                })
            }
        },
        // 生命周期函数creat里面发送数据到后端
        created(){
            // 创建定时器
            this.t = setInterval(() => {
                // 发送ajax请求
                axios.get('http://127.0.0.1:8000/chat/').then(res => {
                    console.log(res.data)
                    this.chatList=res.data.results
                })
            }, 3000)
        },
        beforeDestroy() {
            clearInterval(this.t) // 销毁定时器
            this.t = null
        }
        })

    var app=new Vue({
        el: '#app',
        data: {
            show: false
        },
        methods: {
            handleShow() {
                this.show = !this.show
            }
        }
    })
</script>
# views.py
from rest_framework.viewsets import GenericViewSet
from rest_framework.response import Response
from .models import Chat
from rest_framework.decorators import action
from .serializers import ChatSerializer


class ChatView(GenericViewSet):
    serializer_class = ChatSerializer
    queryset = Chat.objects.all()

    # 127.0.0.1:8000/chat/send/?from_user=1&content=hello---GET
    @action(methods=['GET'], detail=False)
    def send(self, request):
        from_user = request.query_params.get('from_user')
        content = request.query_params.get('content')
        Chat.objects.create(from_user=from_user, content=content)
        return Response({'code': 100, 'msg': '发送成功'}, headers={'Access-Control-Allow-Origin': '*'})

    # 127.0.0.1:8000/chat/
    def list(self, request):
        qs = self.get_queryset()
        ser = self.get_serializer(instance=qs, many=True)
        return Response({'code': 100, 'msg': '查询成功', 'result': ser.data})
# serializer.py
from rest_framework import serializers
from .models import Chat

class ChatSerializer(serializers.ModelSerializer):
    class Meta:
        model = Chat
        fields = '__all__'
# moedels.py
rom django.db import models


class Chat(models.Model):
    from_user = models.CharField(max_length=32, verbose_name='发送者')
    content = models.CharField(max_length=256, verbose_name='发送内容')
    ctime = models.DateTimeField(auto_now_add=True, verbose_name='发送时间')
# setting.py
STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static")
]


DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'chat01',
        'HOST': '127.0.0.1',
        'POST': 3306,
        'USER': 'root',
        'PASSWORD': 'JIAJIA',
    }
}

ref属性(组件间通信)

# ref属性放在普通标签上:
    <input type="text" v-model="name" ref="myinput">
    this.$refs['myinput'] 拿到的是 原生dom对象
    操作dom对象:改值,换属性。。。
# ref属性放在组件上:
     <Child ref="mychild"></Child>
     this.$refs['mychild'] 拿到的是 组件对象
         组件对象.属性
         组件对象.方法
         实现父子间通信

        methods: {
            handleClick() {
                console.log(this.$refs)
                // 1 根据ref指定的名字,取出原生dom对象
                // var i = this.$refs['myinput']
                // console.log(i)
                // i.value = "你好"

                // 2 改图片
                // var i = this.$refs['myimg']
                // i.src='./img/6.png'

                // 3 操作组件对象-->实现组件间通信
                var i = this.$refs['mychild']
                console.log(i.url)
                // 改图片
                i.url = './img/2.png'
                // 执行方法
                i.handleClick('lqz')
            }}})

动态组件component

# 小案例: 点击按钮,切换组件

<body>
<div id="app">
    <h1>点击按钮切换组件</h1>
    <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>
    var vm = new Vue({
        el: '#app',
        data: {
            who: 'Home',
        },
        components: {
            Home: {
                template: `
                <div>
                <h3>我是首页</h3>
                </div>                                `
            },
            Goods: {
                template: `
                <div>
                <h3 style="background-color: aquamarine">我是商品页面</h3>
                </div>                                `
            },
            Order: {
                template: `
                  <div>
                  <h3 style="background-color: red">我是订单</h3>
                  <input type="text" v-model="search">
                  </div>
                `,
                data() {
                    return {
                        search: ''
                    }}},}})
</script>

keep-alive组件缓存

# 组件缓存:但切换回来时,输入的input值还是存在的

<keep-alive>
        <component :is="who"></component>
</keep-alive>

插槽和具名插槽

# 背景:一般编写完1个组件之后组件的内容都是写死的,加数据需去组件中修改,扩展性差
# 作用:  1、一般在组件<Child>  </Child>中插入<div>或者其他是没有效果的

                2、组件中添加<slot></slot>,就可以在的组件标签中添加内容

基本使用:

<body>
<div id="app">
    <h1>插槽使用</h1>
    <div style="background-color: aquamarine">
        <Home>
            <div>
                <img src="./img/1.png" alt="" width="200px" height="300px">
            </div>
        </Home>
    </div>
    <hr>
    <div style="background-color: pink">
        <Home>
            <a href="">点我看美女</a>
        </Home>
    </div>
</div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            who: 'Home',
        },
        components: {
            Home: {
                template: `
                <div>
                <h3>我是首页</h3>
                <slot></slot>
                <h3>结束了</h3>
                </div>                                `
            },}})
</script>

具名插槽:指定某一插槽加入组件样式    <slot name="foot"></slot>

        <Home>
            <div slot="foot">
                <img src="./img/1.png" alt="" width="200px" height="300px">
            </div>
            <div slot="middle">
                <a href="">点我看美女</a>
            </div>
        </Home>

 <slot name="foot"></slot>

vue-cli创建项目

# 创建vue项目,需要借助于几个东西:
   nodejs:
        1、javascript只能运行在浏览器中
        2、把谷歌浏览器的js解释环境---使用c重写,能够运行在操作之上
        3、使用js的语法,就可以写后端了(c写了网络,文件操作,数据库操作)
        4、js的语法,运行在操作系统上的一个解释型后端语言
    vue-cli:vue脚手架,是node的一个模块
# 安装node环境:
1、官网下载安装包:node-v18.16.1-x64.msi 
                    node:python的python命令
                    npm:python的pip命令
2、加速下载第三方模块:(用来替换npm命令的)

        安装模块使用:npm install  ---->现在使用  cnpm install  速度快       

npm install -g cnpm --registry=https://registry.npm.taobao.org

3、安装vue脚手架

        安装完就会释放 vue令     #装完django 释放了django-admin一样,用来创建项目

cnpm install -g @vue/cli

4、使用vue脚手架,创建vue项目:

        另一种创建vue项目方式:图形化界面

vue项目目录介绍

# 运行vue项目的两种方式:
            使用名:npm run dev
            使用pycharm运行:绿色箭头


# 目录结构:
firstvue-项目名


node_modules--存放项目依赖

        等同python的 .venv文件夹,可以删掉,非常多小文件,复制很慢,

        如果没了,执行 cnpm install  就可以在装上,装完项目可以运行
public--文件夹(一般不动)
        favicon.ico   网站小图标
        index.html   单页面应用, 整个vue项目其实就这一个html页面,以后都是组件切换


src --开发重点,以后代码几乎都是写在这里


   assets-- 放一些静态资源, 组件中使用的图片,css,js
   components--放组件的地方,小组件
            HelloWorld.vue  # 默认提供给咱们的
   views--放组件:页面组件
            HomeView.vue  # 首页
            AboutView.vue  #关于


   router--装了vue-router就会有这个文件夹,后面讲      index.js
   store--装 vuex 就会有这个文件夹,后面讲    index.js
   main.js--整个项目的入口
   App.vue--根组件
# 了解 :       
    gitignore                # 使用了git,忽略文件
    babel.config.js       #装了bable就会生成它,语法转换,可以写es高版本语法
    package.json         # 放了项目的依赖
    package-lock.json          # 锁定文件,锁定依赖的版本
    README.md                 #介绍文件
    vue.config.js                  # vue配置文件 一般不动

vue项目文件

# index.html单页面应用,全局只有一个html
            不能禁用js,否则vue项目执行不力
            div  id是app,跟咱们之前写的一样
 # HelloWorld.vue组件化开发,开发阶段,以后在vue项目中,写组件  写 xx.vue
    template:在这里写 html内容
    script:在这里写js
    style:在这里写样式
# 之前写组件:

        之前不能写独立的css,以后都写在 style中

        总结:现在定义组件,只要创建一个 xx.vue,在固定的位置,写固定的代码即可

#组件名字就是:HelloWorld 文件名
    template:template内写的内容
    data(){} :在script中
    <script>
        export default {
          data(){
            return {}
          },
         methods:{}
        }
    </script>

# main.js:控制 index.html 使用哪个跟组件 ---App.vue

import store from './store' //导入语法
// 在这里 new 了vue实例
    new Vue({
      render: h => h(App)
    }).$mount('#app')

# package.json :里面有项目依赖

vue项目开发规范

# 以后做vue开发,只需要创建组件 xx.vue
# 有三部分:
        第一部分--写html,插值,事件绑定        # <template>
        第二部分--data,methods,watch,created    # <script>

        第三部分--写样式        # <style scoped>

es6导入导出语法

# 以后,做了项目开发,肯定要导入某些模块使用

import App from './App.vue'  //语法引入

 # 默认导出和默认导入的使用:
    #在utils.js中 ,导出

    var NAME = '彭于晏'
    function add(a, b) {
        return a + b
    }
    export default { #导出
        add,
        NAME
    }

 # 在想用的位置导入    

import lqz from './lqz/utils' //以后使用lqz代指就是导出的对象

今日思维导图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1375502.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【无标题】用好Java 8的日期时间类

在 Java 8 之前&#xff0c;我们处理日期时间需求时&#xff0c;使用 Date、Calender 和 SimpleDateFormat&#xff0c;来声明时间戳、使用日历处理日期和格式化解析日期时间。但是&#xff0c;这些类的 API 的缺点比较明显&#xff0c;比如可读性差、易用性差、使用起来冗余繁…

竞赛保研 基于深度学习的行人重识别(person reid)

文章目录 0 前言1 技术背景2 技术介绍3 重识别技术实现3.1 数据集3.2 Person REID3.2.1 算法原理3.2.2 算法流程图 4 实现效果5 部分代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的行人重识别 该项目较为新颖&#xff0c;适合…

SpringBoot中使用LocalDateTime踩坑记录

文章目录 前言一、为什么推荐使用java.time包的LocalDateTime而不是java.util的Date&#xff1f;二、使用LocalDateTime和LocalDate时遇到了哪些坑&#xff1f;2.1 Redis序列化报错2.1.1 问题现象2.1.2 问题分析2.1.3 解决方案 2.2 LocalDateTime和LocalDate类型的属性返回给前…

Redis主从复制、哨兵及集群

主从复制 主从复制是高可用Redis的基础&#xff0c;哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份&#xff0c;以及对于读操作的负载均衡和简单的故障恢复。缺陷&#xff1a;故障恢复无法自动化&#xff1b;写操作无法负载均衡&#xff1b;存…

关于httpClient 使用的注意事项

关于httpClient 使用的注意事项 用例 PoolingHttpClientConnectionManager connectionManager new PoolingHttpClientConnectionManager();// 最大连接数-不设置默认20connectionManager.setMaxTotal(200);// 每个路由最大连接数-不设置默认2connectionManager.setDefaultMax…

nginx本地打开vue打包项目

1&#xff0c;首先下载nginx包&#xff0c;然后修改下载的包中的nginx.conf配置文件 其中location后面接的是要增加的域名字段(perbank8)&#xff0c;配置项 index index.html 代表入口文件是index.html 这个在vue项目中也要在nginx配置文件中也要配置同样的路径 在vue项目里…

Fluids —— Up-ressing simulations

目录 Low-res setup Hi-res setup 想象需要一个波浪特写镜头&#xff0c;撞击岩石并产生飞溅&#xff1b;通常会模拟大部分周围海洋&#xff0c;以获得波浪运动&#xff1b;最后&#xff0c;可能只需要模拟tank的20%左右&#xff1b; 通常工作流是测试低粒子数的模拟&#xf…

【一文详解】知识分享:(C#开发学习快速入门)

面向对象(OOP) c语言是面向过程。 c是面向过程面向对象。 c#是纯粹的面向对象: 核心思想是以人的思维习惯来分析和解决问题。万物皆对象。 面向对象开发步骤: 分析对象 特征行为关系(对象关系/类关系) 写代码: 特征–>成员变量 方法–>成员方法 实例化–具体对象 …

JS中垃圾数据是如何自动回收的

JS中垃圾数据是如何自动回收的 背景垃圾回收机制调用栈中的数据回收堆空间中数据回收垃圾回收器的工作流程副垃圾回收器主垃圾回收器 全停顿 背景 在JS栈和堆&#xff1a;数据是如何存储的一文中提到了 JavaScript 中的数据是如何存储的&#xff0c;并通过示例代码分析了原始数…

基于Java SSM框架实现雁门关风景区宣传网站项目【项目源码】

基于java的SSM框架实现雁门关风景区宣传网站演示 Java技术 Java技术它是一个容易让人学会和使用的一门服务器语言。它在编程的过程当中只需要很少的知识就能建立起一个真正的交互站点。对于这个教程来说它并不需要你完全去了解这种语言&#xff0c;只要能快速融入web站点就可以…

盘点2023年我用过的AI大模型,国内也能免费用

大家好&#xff0c;这里是程序员晚枫&#xff0c;今天给大家分享3个我用过的AI工具。 国外的工具这里就不推荐了&#xff0c;推荐了你也不能用。今天只推荐几个国内也能用的。 这些工具的下载链接&#xff0c;我都整理好了&#xff0c;需要的朋友可以在评论区告诉我哟~ 百度…

tailwindcss真的好用吗?

写在前面 今天写一篇关于tailwindcss 的文章&#xff0c;其实这个css技术已经出现很久了&#xff0c;在一些大型项目很多人也已经在用了&#xff0c;虽然不是说必须要会吧&#xff0c;但是没听说过肯定是不行的&#xff0c;他的操作逻辑应该是和unocss差不多&#xff0c;但是今…

MySQL:DML数据操作语言(添加,删除,修改),DDL数据查询语言(条件查询,分组查询,排序查询,分页查询)

目录 1.DML&#xff08;数据操作语言&#xff09;1.添加数据2.修改数据3.删除数据 2.DQL(数据查询语言)1.DQL-语法2.基本查询3.条件查询(WHERE)1.语法&#xff1a;2.条件&#xff1a;3.案例: 4.聚合函数1.介绍2.常见聚合函数3.语法4.案例 5.分组查询&#xff08;GROUP BY&#…

VS2019 C++安装最基本的组件

我是C初学者&#xff0c; 我只想用最基本的C编写程序&#xff0c;不需要MFC。 所以下载了一个离线安装版本放在这里&#xff0c;我自己用的现成的文件。 使用以下命令行创建&#xff1a; 1.C基本组件 不含MFC, 带ATL库 共(1.96G) vs2019.exe --layout d:\vs2019 --lang zh-CN …

C#用string.Replace方法批量替换某一类字符串

目录 一、关于字符串及其操作常识 二、String.Replace 方法 1.重载 2.Replace(Char, Char) 3.Replace(String, String) &#xff08;1&#xff09;实例&#xff1a; &#xff08;2&#xff09;生成结果&#xff1a; 4.Replace(String, String, StringComparison) 5.…

matlab绘图修改坐标轴数字字体大小及坐标轴自定义间隔设置

一、背景 在matlab使用plot函数绘图后&#xff0c;生成的图片坐标轴数字字体大小及间隔可能并不符合我们的要求&#xff0c;因此需要自定义修改&#xff0c;具体方法如下 二、修改坐标轴数字字体大小 只需添加以下命令即可&#xff1a; set(gca,FontName,Times New Roman,F…

DAPP和APP的区别在哪?

随着科技的飞速发展&#xff0c;我们每天都在与各种应用程序打交道。然而&#xff0c;你是否真正了解DAPP和APP之间的区别呢&#xff1f;本文将为你揭示这两者的核心差异&#xff0c;让你在自媒体平台上脱颖而出。 一、定义与起源 APP&#xff0c;即应用程序&#xff0c;通常指…

C++并发编程实战第2版笔记

文章目录 p19 某个线程只可以join()一次p22 只有当joinable()返回true时才能调用detach()P21 在std::thread对象析构前&#xff0c;必须明确是等待还是分离线程P25 移动语义P25 将类的成员函数设定为线程函数p41 std::mutex和类模板std::lock_guard<> p19 某个线程只可以…

多传感器融合SLAM数学学习历程

多传感器融合SLAM数学学习历程 >>> 流形和流形空间&#xff08;姿态&#xff09; https://blog.csdn.net/professor_Xie/article/details/131911894 fast-lio 带着问题 看知识 欧式空间和流形空间的区别和联系? 基本结构&#xff1a;欧式空间是我们熟悉的传统三维…

胖东来热度持续上升的原因是什么?

胖东来超市胖东来超市是一家知名的连锁超市&#xff0c;以其优质的服务和丰富的商品而闻名。在这个充满竞争的市场中&#xff0c;胖东来超市始终保持着良好的业绩和口碑。那胖东来爆火的原因是什么呢&#xff1f; 1.人性化服务&#xff1a;胖东来超市坚信零售不仅仅是商品的销售…