Vue学习笔记 二

news2024/9/22 23:27:02

4、Vue基础扩展

4.1 插槽

  • 组件的最大特性就是复用性,而用好插槽能大大提高组件的可复用能力
  • 在Vue中插槽是很重要的存在,通过插槽,我们可以把父组件中指定的DOM作用到子组件的任意位置,后面我们坐项目用到的组件库比如element-ui,vant-ui都频繁用到的插槽,Vue的插槽主要有匿名插槽,具名插槽,作用域插槽三种,下面我们分别来认识一下他们。
4.1.1 匿名插槽★★★★

故名思义就是没有名字的插槽,只需要在子组件中使用<slot></slot>引入即可

我们来看一下案例哈,如何引入插槽的:

<div id="app">
        <!-- 这里的所有组件标签中嵌套的内容会替换掉slot  如果不传值 则使用 slot 中的默认值  -->
        <alert-box>有bug发生</alert-box>
        <alert-box>有一个警告</alert-box>
        <alert-box></alert-box>
</div>
<script type="text/javascript">
        /*
          组件插槽:父组件向子组件传递内容
        */
        Vue.component('alert-box', {
     
            template: `
            <div>
              <strong>ERROR:</strong>
                        # 当组件渲染的时候,这个 <slot> 元素将会被替换为“组件标签中嵌套的内容”。
                        # 插槽内可以包含任何模板代码,包括 HTML
              <slot>默认内容</slot>
            </div>
          `
        });
        var vm = new Vue({
     
            el: '#app',
            data: {
     

            }
        });
</script>
4.1.2 具名插槽★★★★
  • 具有名字的插槽就是具名插槽
  • 使用 <slot> 中的 “name” 属性绑定元素,name就是插槽的名字
<div id="app">
        <base-layout>
            <!-- 2、 通过slot属性来指定, 这个slot的值必须和下面slot组件得name值对应上
                    如果没有匹配到 则放到匿名的插槽中   -->
            <p slot='header'>标题信息</p>
            <p>主要内容1</p>
            <p>主要内容2</p>
            <p slot='footer'>底部信息信息</p>
        </base-layout>

        <base-layout>
            <!-- 注意点:template临时的包裹标签最终不会渲染到页面上     -->
            <template slot='header'>
                <p>标题信息1</p>
                <p>标题信息2</p>
            </template>
            <p>主要内容1</p>
            <p>主要内容2</p>
            <template slot='footer'>
                <p>底部信息信息1</p>
                <p>底部信息信息2</p>
            </template>
        </base-layout>
</div>
<script type="text/javascript">
        /*
          具名插槽
        */
        Vue.component('base-layout', {
     
            template: `
            <div>
              <header>
                ###	1、 使用 <slot> 中的 "name" 属性绑定元素 指定当前插槽的名字
                <slot name='header'></slot>
              </header>
              <main>
                <slot></slot>
              </main>
              <footer>
                ###  注意点: 
                ###  具名插槽的渲染顺序,完全取决于模板,而不是取决于父组件中元素的顺序
                <slot name='footer'></slot>
              </footer>
            </div>
          `
        });
        var vm = new Vue({
     
            el: '#app',
            data: {
     

            }
        });
</script>
4.1.3 作用域插槽★★★★
  • 可以让父组件对子组件的内容进行加工处理
  • 既可以复用子组件的slot,又可以使slot内容不一致
    • 父组件中使用slot-scope绑定一个属性
    • 子组件中给<slot>标签绑定一个自定义属性,可以传递子组件的内容
    • 父组件通过slot-scope接受子组件传递过来的值即可
<div id="app">
        <!-- 
            1、当我们希望li 的样式由外部使用组件的地方定义,因为可能有多种地方要使用						该组件,但样式希望不一样 这个时候我们需要使用作用域插槽   
        -->
        <fruit-list :list='list'>
            <!-- 2、 父组件中使用了<template>元素,而且包含scope="slotProps",
                slotProps在这里只是临时变量   
            --->
            <template slot-scope='slotProps'>
                <strong v-if='slotProps.info.id==3' class="current">
                    {
  {slotProps.info.name}}
                </strong>
                <span v-else>{
  {slotProps.info.name}}</span>
            </template>
        </fruit-list>
</div>
<script type="text/javascript">
        /*
          作用域插槽
        */
        Vue.component('fruit-list', {
     
            props: ['list'],
            template: `
            <div>
              <li :key='item.id' v-for='item in list'>
              //3、 在子组件模板中,<slot>元素上有一个类似props传递数据给组										件的写法 msg="xxx",
              //插槽可以提供一个默认内容,如果如果父组件没有为这个插槽提供了内										容,会显示默认的内容。
                如果父组件为这个插槽提供了内容,则默认的内容会被替换掉
                <slot :info='item'>{
      {item.name}}</slot>
              </li>
            </div>
          `
        });
        var vm = new Vue({
     
            el: '#app',
            data: {
     
                list: [{
     
                    id: 1,
                    name: 'apple'
                }, {
     
                    id: 2,
                    name: 'orange'
                }, {
     
                    id: 3,
                    name: 'banana'
                }]
            }
        });
</script>

4.2 案例讲解-购物车

前面我们学了组件,我们也知道Vue的核心是组件系统和数据驱动,下面我们来做一个购物车的案例,巩固深化一下我们所学的理论知识

4.2.1 组件化布局组件拆分★★★★
  • 把静态页面转换为组件化模式
  • 把组件渲染到页面上显示效果如下所示

代码效果如下:

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css">
<style>
        #app {
     
            width: 600px;
            margin-top: 30px;
        }
        .header {
     
            width: 100%;
            height: 40px;
            line-height: 40px;
            text-align: center;
            background-color: aquamarine;
        }

        .footer {
     
            width: 100%;
            height: 50px;
            line-height: 50px;
            background-color: azure;
            text-align: right;
        }

        .footer>span {
     
            padding: 0px 15px;
            font-weight: bold;
            font-size: 15px;
            color: brown;
        }
</style>

上面写了点简单的样式,效果如上图所示

<div id="app" class="container">
    <my-cart></my-cart>
</div>
<script>
        //1、 把静态页面转换成组件化模式
        //1.1  标题组件 
        var CartTitle = {
     
            template: `
                <div class="header">我的商品</div>
            `
        }
        //1.2  商品列表组件
        var CartList = {
     
            template: `
            <table class="table table-bordered">
                <tr>
                    <td><img src="media/day06-a.jpg" width="50" /></td>
                    <td>
                        <button>-</button>
                        <input type="text" />
                        <button>+</button>
                    </td>
                    <td><button class="btn btn-sm btn-danger">删除</button></td>
                </tr>
                <tr>
                    <td><img src="media/day06-b.jpg" width="50" /></td>
                    <td>
                        <button>-</button>
                        <input type="text" />
                        <button>+</button>
                    </td>
                    <td><button class="btn btn-sm btn-danger">删除</button></td>
                </tr>
                <tr>
                    <td><img src="media/day06-c.jpg" width="50" /></td>
                    <td>
                        <button>-</button>
                        <input type="text" />
                        <button>+</button>
                    </td>
                    <td><button class="btn btn-sm btn-danger">删除</button></td>
                </tr>
            </table>
            `
        }
        //结算组件
        var CartTotal = {
     
            template: `
            <div class="footer">
                <span>总价: 100</span> &nbsp;&nbsp;
                <button class="btn btn-danger">结算</button>
            </div>
            `
        }
        //定义一个全局组件 my-cart
        Vue.component("my-cart", {
     
            // 引入子组件
            template: `
            <div>
                <cart-title></cart-title>
                <cart-list></cart-list>
                <cart-total></cart-total>
            </div>
            `,
            //注册子路由组件
            components: {
     
                'cart-title': CartTitle,
                'cart-list': CartList,
                'cart-total': CartTotal
            }
        });
        new Vue({
     
            el: "#app",
            data: {
     
            },
            methods: {
     

            }
        })
</script>
4.2.2完成标题和结算组件功能 组件传值★★★★
  • 标题组件事件动态渲染
    • 从父组件把标题数据传递过来 即 父向子组件传值
    • 把传递过来的数据渲染到页面上
  • 结算功能组件
    • 从父组件把商品列表list 数据传递过来 即 父向子组件传值
    • 把传递过来的数据计算最终价格渲染到页面上
<div id="app" class="container">
        <my-cart></my-cart>
</div>
<script>
        //1、 把静态页面转换成组件化模式
        //1.1  标题组件 
        var CartTitle = {
     
            props: ['title'],
            template: `
                <div class="header">{
      {title}}</div>
            `
        }
        //结算组件,子组件接受值即可
        var CartTotal = {
     
            props: ['goods_list'],
            template: `
            <div class="footer">
                <span>总价: {
      {total}}</span> &nbsp;&nbsp;
                <button class="btn btn-danger">结算</button>
            </div>
            `,
            computed: {
     
                total:function(){
     
                    let amounts = 0;
                    this.goods_list.forEach(item=>{
     
                        amounts +=item.price*item.num;
                    })
                    return amounts.toFixed(2);
                }
            },
        }
        //定义一个全局组件 my-cart
        Vue.component("my-cart", {
     
            data: function () {
     
                return {
     
                    title: "我的商品",
                    goods_list: [
                        {
     
                            id: 1,
                            name: 'TCL彩电',
                            price: 1000,
                            num: 1,
                            img: 'media/day06-a.jpg'
                        }, {
     
                            id: 2,
                            name: '机顶盒',
                            price: 1000,
                            num: 1,
                            img: 'media/day06-b.jpg'
                        }, {
     
                            id: 3,
                            name: '海尔冰箱',
                            price: 1000,
                            num: 1,
                            img: 'media/day06-c.jpg'
                        }, {
     
                            id: 4,
                            name: '小米手机',
                            price: 1000,
                            num: 1,
                            img: 'media/day06-d.jpg'
                        }, {
     
                            id: 5,
                            name: 'PPTV电视',
                            price: 1000,
                            num: 2,
                            img: 'media/day06-e.jpg'
                        }
                    ]
                }
            },
            // 引入子组件,父组件向子组件进行传值
            template: `
            <div>
                <cart-title :title="title"></cart-title>
                <cart-list ></cart-list>
                <cart-total :goods_list="goods_list"></cart-total>
            </div>
            `,
            //注册子路由组件
            components: {
     
                'cart-title': CartTitle,
                'cart-list': CartList,
                'cart-total': CartTotal
            }
        });
 </script>
4.2.3 完成列表组件删除商品功能splice★★★★
  • 从父组件把商品列表list 数据传递过来 即 父向子组件传值
  • 把传递过来的数据渲染到页面上
  • 点击删除按钮的时候删除对应的数据
    • 给按钮添加点击事件把需要删除的id传递过来
      • 子组件中不推荐操作父组件的数据,有可能多个子组件使用父组件的数据,我们需要把数据 传递给父组件让父组件操作数据
      • 父组件删除对应的数据
<div id="app" class="container">
        <my-cart></my-cart>
</div>
<script>
        //1、 把静态页面转换成组件化模式
        //1.1  标题组件 
        var CartTitle = {
     
            props: ['title'],
            template: `
                <div class="header">{
      {title}}</div>
            `
        }
        //1.2  商品列表组件
        var CartList = {
     
            props: ['goods_list'],
            template: `
            <table class="table table-bordered">
                <tr v-for="(item,index) in goods_list" :key="item.id">
                    <td>
                        <img :src="item.img" width="50" />
                        {
      {item.name}}
                    </td>
                    <td>
                        <button>-</button>
                        <input type="text" v-model="item.num"/>
                        <button>+</button>
                    </td>
                    <td><button class="btn btn-sm btn-danger" @click='del(item.id)'>删除</button></td>
                </tr>
            </table>
            `,
            methods: {
     
                del(id) {
     
                    console.log(id);
                    this.$emit("cart-del", id);
                }
            }
        }
        //结算组件,子组件接受值即可
        var CartTotal = {
     
            props: ['goods_list'],
            template: `
            <div class="footer">
                <span>总价: {
      {total}}</span> &nbsp;&nbsp;
                <button class="btn btn-danger">结算</button>
            </div>
            `,
            computed: {
     
                total: function () {
     
                    let amounts = 0;
                    this.goods_list.forEach(item => {
     
                        amounts += item.price * item.num;
                    })
                    return amounts.toFixed(2);
                }
            },
        }
        //定义一个全局组件 my-cart
        Vue.component("my-cart", {
     
            data: function () {
     
                return {
     
                    title: "我的商品",
                    goods_list: [
                        {
     
                            id: 1,
                            name: 'TCL彩电',
                            price: 1000,
                            num: 1,
                            img: 'media/day06-a.jpg'
                        }, {
     
                            id: 2,
                            name: '机顶盒',
                            price: 1000,
                            num: 1,
                            img: 'media/day06-b.jpg'
                        }, {
     
                            id: 3,
                            name: '海尔冰箱',
                            price: 1000,
                            num: 1,
                            img: 'media/day06-c.jpg'
                        }, {
     
                            id: 4,
                            name: '小米手机',
                            price: 1000,
                            num: 1,
                            img: 'media/day06-d.jpg'
                        }, {
     
                            id: 5,
                            name: 'PPTV电视',
                            price: 1000,
                            num: 2,
                            img: 'media/day06-e.jpg'
                        }
                    ]
                }
            },
            // 引入子组件,父组件向子组件进行传值
            template: `
            <div>
                <cart-title :title="title"></cart-title>
                <cart-list :goods_list="goods_list" @cart-del="removeGoods"></cart-list>
                <cart-total :goods_list="goods_list"></cart-total>
            </div>
            `,
            //注册子路由组件
            components: {
     
                'cart-title': CartTitle,
                'cart-list': CartList,
                'cart-total': CartTotal
            },
            methods: {
     
                removeGoods(id) {
     
                    console.log(id)
                    let index = this.goods_list.findIndex(item => {
     
                        return item.id == id;
                    });
                    this.goods_list.splice(index, 1);
                }
            }
        });
        new Vue({
     
            el: "#app",
            data: {
     
            },
            methods: {
     

            }
        })
</script>
4.2.4 完成列表组件更新商品数量computed★★★★
  • 将输入框中的默认数据动态渲染出来
  • 输入框失去焦点的时候 更改商品的数量
  • 点击按钮+和按钮-更新商品的数量,同步更新总价格
  • 子组件中不推荐操作数据 把这些数据传递给父组件 让父组件处理这些数据
  • 父组件中接收子组件传递过来的数据并处理
<div id="app" class="container">
        <my-cart></my-cart>
</div>
<script>
        //1、 把静态页面转换成组件化模式
        //1.1  标题组件 
        var CartTitle = {
     
            props: ['title'],
            template: `
                <div class="header">{
      {title}}</div>
            `
        }
        //1.2  商品列表组件
        var CartList = {
     
            props: ['goods_list'],
            template: `
            <table class="table table-bordered">
                <tr v-for="(item,index) in goods_list" :key="item.id">
                    <td>
                        <img :src="item.img" width="50" />
                        {
      {item.name}}
                    </td>
                    <td>
                        <button @click="decr(item.id)">-</button>
                        <input type="text" :value="item.num" @blur="changeNums(item.id,$event)"/>
                        <button @click="incr(item.id)">+</button>
                    </td>
                    <td><button class="btn btn-sm btn-danger" @click='del(item.id)'>删除</button></td>
                </tr>
            </table>
            `,
            methods: {
     
                del(id) {
     
                    console.log(id);
                    this.$emit("cart-del", id);
                },
                changeNums(id, event) {
     
                    this.$emit("change-num",
                        {
     
                            id: id,
                            type: 'change',
                            num: event.target.value
                        }
                    )
                },
                incr(id) {
     
                    this.$emit('change-num',
                        {
     
                            id: id,
                            type: 'incr',
                        }
                    );
                },
                decr(id) {
     
                    this.$emit('change-num',
                        {
     
                            id: id,
                            type: 'decr',
                        }
                    );
                }
            }
        }
        //结算组件,子组件接受值即可
        var CartTotal = {
     
            props: ['goods_list'],
            template: `
            <div class="footer">
                <span>总价: {
      {total}}</span> &nbsp;&nbsp;
                <button class="btn btn-danger">结算</button>
            </div>
            `,
            computed: {
     
                total: function () {
     
                    let amounts = 0;
                    this.goods_list.forEach(item => {
     
                        amounts += item.price * item.num;
                    })
                    return amounts.toFixed(2);
                }
            },
        }
        //定义一个全局组件 my-cart
        Vue.component("my-cart", {
     
            data: function () {
     
                return {
     
                    title: "我的商品",
                    goods_list: [
                        {
     
                            id: 1,
                            name: 'TCL彩电',
                            price: 1000,
                            num: 1,
                            img: 'media/day06-a.jpg'
                        }, {
     
                            id: 2,
                            name: '机顶盒',
                            price: 1000,
                            num: 1,
                            img: 'media/day06-b.jpg'
                        }, {
     
                            id: 3,
                            name: '海尔冰箱',
                            price: 1000,
                            num: 1,
                            img: 'media/day06-c.jpg'
                        }, {
     
                            id: 4,
                            name: '小米手机',
                            price: 1000,
                            num: 1,
                            img: 'media/day06-d.jpg'
                        }, {
     
                            id: 5,
                            name: 'PPTV电视',
                            price: 1000,
                            num: 2,
                            img: 'media/day06-e.jpg'
                        }
                    ]
                }
            },
            // 引入子组件,父组件向子组件进行传值
            template: `
            <div>
                <cart-title :title="title"></cart-title>
                <cart-list :goods_list="goods_list" 
                    @cart-del="removeGoods"
                    @change-num="changeNums"
                ></cart-list>
                <cart-total :goods_list="goods_list"></cart-total>
            </div>
            `,
            //注册子路由组件
            components: {
     
                'cart-title': CartTitle,
                'cart-list': CartList,
                'cart-total': CartTotal
            },
            methods: {
     
                removeGoods(id) {
     
                    console.log(id)
                    let index = this.goods_list.findIndex(item => {
     
                        return item.id == id;
                    });
                    this.goods_list.splice(index, 1);
                },
                changeNums(data) {
     
                    let id = data.id;
                    let index = this.goods_list.findIndex(item => {
     
                        return item.id == id;
                    });
                    if (data.type == "change") {
     
                        this.goods_list[index].num = data.num;
                    }

                    if (data.type == "incr") {
     
                        this.goods_list[index].num++;
                    }
                    if (data.type == "decr") {
     
                        this.goods_list[index].num--;
                    }
                }
            }
        });
</script>

4.3 接口调用方式

前端要做动态数据渲染,只能通过调用接口的方式来获取服务端的数据,目前常见的方式有ajax,fetch,axios等常见的方式可以获取接口的数据,我们来分别认识一下这些操作方式…

4.3.1 原生ajax★★★★

ajax主要是负责是客户端和服务端异步数据通信的工具,原生的ajax对浏览器支持比较好,所以群众基础还是比较广的,我们先来看一下原生的ajax如何实现对接口数据的请求:

原生的ajax请求数据大致分为如下几个步骤:

<script>
        let xhr = null;
        //实例化xmlhttprequest对象
        xhr = new XMLHttpRequest();
        //配置要请求的接口地址
        xhr.open("post","url地址",true);
        //设置请求的头部信息,如果是post请求的话
        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
        //设置请求后状态发生变化的回调函数
        xhr.onreadystatechange = ()=>{
     

        };
        // 发送请求
        xhr.send();
</script>
4.3.2 jQuery的ajax★★★★

但是我们大部分时候可能用上面原生的ajax的时候是很少的,我们一般都是用jQuery封装好的Api,这个前提是我们需要先引入jQuery文件,否则提示报错,jQuery的ajax使用步骤大致如下所示

<script>
        $.ajax({
     
            url:"",
            data:{
     

            },
            type: "post",
            dataType: "json",
            async: true,
            success(res){
     

            },
            error(){
     

            }
        })
</script>
4.3.3 fetch★★★★
  • Fetch API是新的ajax解决方案 Fetch会返回Promise
  • fetch不是ajax的进一步封装,而是原生js,没有使用XMLHttpRequest对象
  • 基本结构大致如下 fetch(url, options).then()
<script type="text/javascript">
        /*
          Fetch API 基本用法
              fetch(url).then()
             第一个参数请求的路径   
             Fetch会返回Promise   
             所以我们可以使用then 拿到请求成功的结果 
        */
        fetch('http://localhost:3000/fdata').then(function (data) {
     
            // text()方法属于fetchAPI的一部分,
            //它返回一个Promise实例对象,用于获取后台返回的数据
            return data.text();
        }).then(function (data) {
     
            //   在这个then里面我们能拿到最终的数据  
            console.log(data);
        })
</script>
  • fetch支持很多请求的方式如POST,GET,DELETE,UPDATE,PATCH和PUT
    • 默认的是 GET 请求
    • 需要在 options 对象中 指定对应的 method method:请求使用的方法
    • post 和 普通 请求的时候 需要在options 中 设置 请求头 headers 和 body
<script type="text/javascript">
        /*
              Fetch API 调用接口传递参数
        */
        //1.1 GET参数传递 - 传统URL  通过url  ? 的形式传参
        fetch('http://localhost:3000/books?id=123', {
     
            //get 请求可以省略不写 默认的是GET 
            method: 'get'
        }).then(function (data) {
     
            //它返回一个Promise实例对象,用于获取后台返回的数据
            return data.text();
        }).then(function (data) {
     
            //在这个then里面我们能拿到最终的数据
            console.log(data)
        });

        //1.2  GET参数传递  restful形式的URL  通过 / 的形式传递参数  即  id = 456 和id后台的配置有关
        fetch('http://localhost:3000/books/456', {
     
            //get 请求可以省略不写 默认的是GET 
            method: 

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

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

相关文章

【hot100篇-python刷题记录】【在排序数组中查找元素的第一个和最后一个位置】

R7-二分查找篇 目录 双指针 二分优化 ps: 思路&#xff1a; 双指针 直接用双指针回缩啊 class Solution:def searchRange(self, nums: List[int], target: int) -> List[int]:ret[-1,-1]left,right0,len(nums)-1while left<len(nums):if nums[left]target:ret[0]…

可解释性与公平性的关系

可解释模型更有可能公平的三个原因 可解释性和公平性似乎是相辅相成的。可解释性涉及理解模型如何进行预测。公平性涉及理解预测是否偏向某些群体。负责任的人工智能框架和机器学习会议始终将这两个特征一起提及。然而&#xff0c;可解释性并不一定意味着公平。 话虽如此&…

[米联客-XILINX-H3_CZ08_7100] FPGA程序设计基础实验连载-26浅谈XILINX FIFO的基本使用

软件版本&#xff1a;VIVADO2021.1 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA 实验平台&#xff1a;米联客-MLK-H3-CZ08-7100开发板 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 http…

9、Django Admin优化查询

如果你的Admin后台中有很多计算字段&#xff0c;那么你需要对每个对象运行多个查询&#xff0c;这会使你的Admin后台变得非常慢。要解决此问题&#xff0c;你可以重写管理模型中的get_queryset方法使用annotate聚合函数来计算相关的字段。 以下示例为Origin模型的中ModelAdmin…

Spring6梳理5——基于XML管理Bean环境搭建

以上笔记来源&#xff1a; 尚硅谷Spring零基础入门到进阶&#xff0c;一套搞定spring6全套视频教程&#xff08;源码级讲解&#xff09;https://www.bilibili.com/video/BV1kR4y1b7Qc 目录 ①搭建模块 ②引入配置文件 ③创建BeanXML文件 ④创建Java类文件&#xff08;User…

在K8s上运行GitHub Actions的自托管运行器

1&#xff1a;添加Actions Runner Controller的Helm仓库 helm repo add actions-runner-controller https://actions-runner-controller.github.io/actions-runner-controller helm repo update2&#xff1a;创建GitHub Personal Access Token (PAT) 登录到你的GitHub账户。访…

SQL语句(数据更新、查询操作)

数据库表操作 创建数据库语法格式 create table 表名(字段名1 类型 约束&#xff0c;字段名2 类型 约束&#xff0c;..... ..... )创建学生表&#xff0c;字段要求如下&#xff1a; 姓名&#xff08;长度为10&#xff09;、年龄、身高&#xff08;保留2位小数&#xff09; cre…

安卓shiply热更新入门

目录 一。我的开发环境 二。集成shiply热更新sdk 三。编写代码 1。创建一个CustomRFixLog类 2。创建一个MyApplication类 3。配置AndroidManifest.xml 4。创建一个新的Activity继承AbsRFixDevActivity 用于测试 四。登录shiply后台配置 1。创建项目 五。制作补丁 1。在app…

Ae关键帧动画基础练习-街道汽车超车

目录 1.让背景向左移动 2.让小红车匀速移动 3.实现小黄车的超车 完成街道汽车超车的一个简单动画&#xff0c;背景向左移动看起来就如同画面向右移动了一般&#xff0c;根据这个原理&#xff0c;可以完成这个动画。 导入素材时&#xff0c;要选择不同的图层&#xff0c;这样…

微软AD替代方案统一管理Windows和信创电脑的登录认证与网络准入认证

自国资委79号文明确了2027年底前信息系统全面国产化的目标后&#xff0c;金融单位、央国企集团及各子公司纷纷加大国产化改造力度。不少子、孙公司表示&#xff0c;集团要求到2024年底或2025年底国外的关键IT基础设施要停止使用&#xff0c;如微软AD、云桌面等。 信创国产化是大…

Mybatis链路分析:JDK动态代理和责任链模式的应用

背景 此前写过关于代理模式的文章&#xff0c;参考&#xff1a;代理模式 动态代理功能&#xff1a;生成一个Proxy代理类&#xff0c;Proxy代理类实现了业务接口&#xff0c;而通过调用Proxy代理类实现的业务接口&#xff0c;实际上会触发代理类的invoke增强处理方法。 责任链功…

艾体宝洞察丨透过语义缓存,实现更快、更智能的LLM应用程序

传统的缓存只存储数据而不考虑上下文&#xff0c;语义缓存则不同&#xff0c;它能理解用户查询背后的含义。它使数据访问更快&#xff0c;系统响应更智能&#xff0c;对 GenAI 应用程序至关重要。 什么是语义缓存&#xff1f; 语义缓存解释并存储用户查询的语义&#xff0c;使…

功率谱密度估计(Power Spectral Density Estimation, PSD)介绍,轴承磨损检测

介绍 功率谱密度估计&#xff08;Power Spectral Density Estimation, PSD&#xff09;是信号处理中的一项重要技术&#xff0c;用于描述信号在频率域中的能量分布。PSD提供了信号的功率随频率变化的情况&#xff0c;是分析随机信号和确定信号频率特性的常用工具。 功率谱密度…

美团代付支持多模板全开源多种支付通道 多模版三合一源码附教程

美团代付 支持多模板全开源多种支付通道 多模版三合一源码附教程 美团代付源码&#xff0c;支持多模板&#xff0c;全开源&#xff0c;多种支付通道&#xff0c;其它的就没什么好介绍的了&#xff0c;有兴趣的自行去体验吧。

驱动(RK3588S)第五课时:字符设备驱动编程

目录 一、操作系统的框架二、设备的类型三、什么是设备四、杂项字符设备的 API五、代码实现1、底层实现&#xff08;内核&#xff09;2、应用层代码3、交叉编译环境4、结果展示 一、操作系统的框架 二、设备的类型 硬件设备其实是分类型的&#xff1a; 字符设备&#xff1a;所…

TCP/IP 报文传输过程

目录 1. 概念理解2. 传输过程 原文回到 TCP/IP 强烈推荐下面博客&#xff0c;详细阐述了TCP/IP协议概念和传输过程 TCP协议详解 (史上最全) 1. 概念理解 2. 传输过程 以一个具体例子为例&#xff0c;如下图所示&#xff0c;由A 给 F 发送一个数据包整个过程是怎样的

Windows 安装 MySQL8

目录 前言 下载 安装 配置 连接 前言 一般数据库都是部署在 Linux 服务器上&#xff0c;在 Windows 上开发&#xff0c;通过数据库连接工具来连接数据库。在工作中&#xff0c;如果条件允许&#xff0c;会有单独的开发库给开发人员使用&#xff0c;否则开发人员就只能连接…

U盘损坏深度解析与高效数据恢复指南

一、U盘损坏现象初探 在数字化时代&#xff0c;U盘作为便捷的数据存储与传输工具&#xff0c;几乎成为了我们日常生活与工作中的必需品。然而&#xff0c;不少用户都曾遭遇过U盘损坏的困境&#xff0c;面对无法读取、文件丢失或系统提示错误等问题&#xff0c;往往感到束手无策…

【概率与统计 动态规划】 808. 分汤

本文涉及知识点 C动态规划 数学 概率与统计 LeetCode 808. 分汤 有 A 和 B 两种类型 的汤。一开始每种类型的汤有 n 毫升。有四种分配操作&#xff1a; 提供 100ml 的 汤A 和 0ml 的 汤B 。 提供 75ml 的 汤A 和 25ml 的 汤B 。 提供 50ml 的 汤A 和 50ml 的 汤B 。 提供 25…

Chapter 10 async函数 await关键字

欢迎大家订阅【Vue2Vue3】入门到实践 专栏&#xff0c;开启你的 Vue 学习之旅&#xff01; 文章目录 前言一、async 函数二、await 关键字 前言 在现代 JavaScript 开发中&#xff0c;异步编程是一个重要的概念。随着 ES2017 的引入&#xff0c;async 函数和 await 关键字为处…