Vue2(八):脚手架结构、render函数、ref属性、props配置项、mixin(混入)、插件、scoped样式

一、脚手架结构分析

crl+c终止刚刚搭建的vue。

├── node_modules 
├── public
│   ├── favicon.ico: 页签图标
│   └── index.html: 主页面
├── src
│   ├── assets: 存放静态资源
│   │   └── logo.png
│   │── component: 存放组件
│   │   └── HelloWorld.vue
│   │── App.vue: 汇总所有组件
│   │── main.js: 入口文件
├── .gitignore: git版本管制忽略的配置
├── babel.config.js: babel的配置文件
├── package.json: 应用包配置文件 
├── README.md: 应用描述文件
├── package-lock.json:包版本控制文件

在创建vue代码时我遇到了如下问题:在终端打开vue项目时,一直出现You may use special comments to disable some warnings. Use // eslint-disable-next-line to ignore the这样的问题,解决办法如下:

You may use special comments to disable some warnings. Use // eslint-disable-next-line to ignore the-CSDN博客

二、render函数

1.接上方报错解决

如果要用render函数的话,就把上面注释掉的那行代码重新编译出来

但如果用下面普通的 写法,就要把这行代码注释掉!

终于懂了!在这卡了半天

1.vue.js与vue.runtime.xxx.js的区别

(1)vue.js是完整版的Vue,包含:核心功能+模板解析器
(2)vue.runtime.xxx.js是运行版的Vue,只包含:核心功能;没有模板解析器。

因为vue.runtime.xxx.js没有模板解析器,所以不能使用template这个配置项,需要使用render函数接收到的createElement函数去指定具体内容。为什么其他的.vue文件里写template标签就行呢?那是因为template写的是标签,而且在组件里,鱿鱼西专门儿又搞了个库去专门解析组件里的模板

2.render函数是干啥的?

render中文意思是渲染,render函数其实就扮演了vue中解析template模板的那块儿代码,把组件的内容解析一下子,渲染到页面上。我理解的感觉render就是个钩子(可能不是),当需要解析模板渲染页面时拿过来用一下,返回组件里的东西们,然后放到页面上。

(1)写个正常的renderi函数:

 render: function (createElement) {
    // console.log(typeof createElement);  //createElement是一个函数
    return createElement(App);
  }

(2)render函数写成箭头函数:

render: h => h(app)

3.为什么要引入残缺的vue呢?为什么用render?

vue.js是完整版的Vue,由核心和模板解析器组成。但是模板解析器占用的内存太大(占三分之一vue),开发完成后并不需要模板解析器。(模板解析器就像雇的贴瓷砖的工人,工人干完活儿就可以离开了,瓷砖就是那个Vue核心,就一直在那待着了)

 老师这个图看着还是很好理解的!

三、脚手架修改默认设置

vue.config.js配置文件

1、使用vue inspect > output.js可以查看到Vue脚手架的默认配置。
2、使用vue.config.js可以对脚手架进行个性化定制,详情见:Vue CLI

怎么说呢,一般不会改,如果有需要改的,可以在在vue cli里面看怎么修改

四、ref属性

被用来给元素或子组件注册引用信息(id的替代者)
应用在html标签上获取的是真实DOM元素,应用在组件标签上是组件实例对象(vc)
使用方式:
1、打标识:<h1 ref="xxx">.....</h1>或 <School ref="xxx"></School>
2、获取:this.$refs.xxx

看看代码就明白了:(电脑太卡了,这下面的代码是用其他的博主的Vue2(七):配置脚手架、render函数、ref属性、props配置项、mixin(混入)、插件、scoped样式_vue2 render-CSDN博客)

1、main.js

// 引入Vue
import Vue from 'vue';
// 引入App
import App from './App.vue';

Vue.config.productionTip = false;

// 创建一个Vue实例
new Vue({
    el: '#app',
    render: h => h(App)
});

2、MySchool 

关于起名这块,想想非单文件组件,那里边我们写的时候,const School2 = Vue.extend({…}),然后下边components:{School1: School2}; 其实呢在单文件组件里,相当于是组件里写name:‘School2’,import School1,Vue开发者工具显示的是School2,但我们在代码里使用的是School1这个名字。

<template>
    <div>
        <h2>学校名称:{{ name }}</h2>
        <h2>学校地址:{{ address }}</h2>
    </div>
</template>

<script>
import Vue from 'vue';
const MySchool = Vue.extend({
    // 如果组件没写名字,那么就用的import后面起的名字
    data() {
        return {
            name: '前端',
            address: '杭州'
        }
    }
})
export default MySchool
</script>

3.App.vue

<template>
    <div>
        <h1 v-text="msg" ref="title"></h1>
        <button @click="showDom" ref="btn">点我输出上方的DOM元素</button>
        <MySchool111 ref="school" id="school"></MySchool111>
    </div>
</template>

<script>
// 如果组件没写名字,那么就用的import后面起的名字
import MySchool111 from './compoments/MySchool.vue';

export default {
    name: 'Appppp',  //这里如果写名字,开发者工具里看的就是这个名字
    components: {
        MySchool111
    },
    data() {
        return {
            msg: '从蓬莱写到仙台,哥们儿代码信手拈来'
        }
    },
    methods: {
        showDom() {
            // console.log(document.getElementById('title')); //这种写法拿不到组件
            console.log(this.$refs.title); //拿到h1真实DOM元素标签
            console.log(this.$refs.btn); //拿到button真实DOM元素标签
            console.log(this.$refs.school); //拿到组件的实例(MySchool的vc)

            //如果这么写,拿到的是组件template中的内容,相当于给根的div加了个id="school"
            console.log(document.getElementById('school'));
        }
    },
}
</script>

五、props配置项 

功能:让组件接收外部传过来的数据。
props这个配置项就类似微信转账,App那边的标签里传过来,这边得接一下子

1.传递数据:

方式:在App.vue(或者父组件)中的组件标签中写属性:

<template>
    <div>
        <!-- 加个单项数据绑定,引号里面就不是字符串了,就是表达式了 -->
        <Student name="李四" sex="女" :age="20"></Student>
        <Student name="王五" sex="男" :age="20 + 1" />
        <!-- <Student name="zzy" sex="男" age="20" /> -->
    </div>
</template>

2.接收数据:

(1)简单接收,用的比较多

props: ['name', 'age', 'sex']

(2)限制类型接收

接收的同时对数据进行类型限制

props: {
    name: String,
    age: Number,
    sex: String
}

(3)限制类型、限制必要性、指定默认值

接收时同时对数据:进行类型校验+默认值指定+必要性限制

props: {
        name: {
            type: String,   //name的类型是字符串
            required: true  //name是必须填的
        },
        age: {
            type: Number, //age的类型时数值
            default: 99  //age可以不填,不填就是99
        },
        sex: {
            type: String,   //sex的类型是字符串
            required: true  //sex是必须填的
        }
    }

3.几个注意点

1、在传递数据的时候如果想实现正确收取数值数据,并且不想把props写那么复杂,可以加个v-bind:age="18",这样的话引号里边就不会是字符串了,而是当成js表达式执行,返回的结果就是数值

2、props中的内容优先级最高,先接这里边的数据放vc里,再去读data里的数据,若data中数据有重复则优先使用props中的数据,不会覆盖

3、props是只读的,Vue底层会监测你对props的修改,如果进行了修改,就会发出警告(能修改成功但是不建议改)。

组件是可复用的,假设该子组件被复用了n次,当某一个组件意外地更改了其接受到的props数据 ----> 意味着,同时更改了父组件中相对应的属性值 ----> 意外地更改其它(n-1)个子组件中的 props数据,引起混乱。(我当前组件就想用最新的值,但是其他组件就想保存原始值,这不就乱套了吗)所以我们不应该在子组件中直接更改其props数据!。(其实有时候可以改,那就是props传过来的值是不一样的,是通过v-for遍历出来的,组件的数据不会相互影响,这种情况我觉得可以改)

若业务需求确实需要修改,那么请复制props的内容到data中一份(data中新建个名字),然后去修改data中的数据,同时把data中的东西呈现到页面上去,具体看下边的代码

4.子组件Student.vue代码

这里提醒一下,data中尽量不要用this

<template>
    <div>
        <h1>{{ msg }}</h1>
        <h2>学生名称:{{ name }}</h2>
        <h2>学生性别:{{ sex }}</h2>
        <!-- 实现年龄+1 要加v-bind把引号里的东西变成js表达式,否则是字符串+1-->
        <!-- <h2>学生年龄:{{ age*1+1 }}</h2> 强制类型转换一下-->
        <h2>学生年龄age:{{ age + 1 }}</h2>
        <h2>学生年龄myAge:{{ myAge + 1 }}</h2>
        <button @click="updateAge">尝试修改收到的年龄</button>
    </div>
</template>

<script>
export default {
    name: 'Student',
    data() {
        return {
            msg: '从蓬莱写到仙台,哥们儿代码信手拈来',
            //想要修改age,就要用一个新的变量myAge来接收传进来的值
            //然后页面显示myAge就能实现修改,props里的东西是只读的
            myAge: this.age
            // name: 'zzy',
            // age: 18,
            // sex: '男'
        }
    },
    methods: {
        updateAge() {
            // this.age++;  //会报错但是能改但是不建议改
            this.myAge++;
        }
    },
    //props这个配置项就类似微信转账,App那边的标签里传过来,这边得接一下子
    //props中的内容优先级最高,先接这边的数据放vc里,再去读data,若有重复不会覆盖
    props: ['name', 'age', 'sex']
}
</script>

 六、mixin(混入)

功能:可以把多个组件共用的配置提取成一个混入对象

使用方式:

1.第一步定义混合:

定义在另一个js文件中,这里定义在mixin.js中

export const hunhe1 = {
    methods: {
        showName() {
            alert(this.name);
        }
    },
    mounted() {
        console.log('混合里的mounted优先调用');
    }
}

2.第二步使用混合:

全局混入:Vue.mixin(xxx),全局混合不用引入,自动就搞到所有东西上了
​局部混入:mixins:['xxx']

1、先在组件中引入

import { hunhe1 } from '../mixin'

2.在组件中使用mixins: [hunhe1]

<template>
    <div>
        <h2 @click='showName'>学校名称:{{ name }}</h2>
        <h2>学校地址:{{ address }}</h2>
    </div>
</template>

<script>
//引入一个混合
import { hunhe1 } from '../mixin'
export default {
    name: 'School',
    data() {
        return {
            name: '前端',
            address: '杭州'
        }
    },
    mixins: [hunhe1],
    mounted() {
        console.log('组件里单独写mounted比mixin中的mounted后调用')
    }
}
</script>

注意:
1、混合里的mounted优先调用,组件里单独写mounted比mixin中的mounted后调用
2、组件里原来有的数据,在混合中写不会覆盖原数据;组件里原来没有的数据,混合中写会添加过去和原数据合并

七、插件

1.插件是干啥的?

功能:用于增强Vue
本质:包含install方法的一个对象,install的第一个参数是Vue,第二个以后的参数是插件使用者传递的数据。

2.定义插件

可以在另一个js中配置插件,然后通过import引入到main.js中
看看下面的代码,复习复习之前的知识

const plusobj = {
    install(Vue, x, y, z) {
        console.log(Vue);  //第一个参数是Vue构造函数
        console.log(x, y, z); //后面的参数是使用者传进来的东西123

        //1.定义一个全局过滤器
        Vue.filter('mySlice', function (val) {
            return val.slice(0, 4);  //返回值别忘了
        });

        //2.定义一个全局自定义指令,元素默认获取焦点
        Vue.directive('fbind', {
            bind(el, binding) {
                el.value = binding.value;
            },
            inserted(el) {
                el.focus();
            },
            update(el, binding) {
                el.value = binding.value;
            }
        })

        //3.定义一个全局混合,不用引入就能给所有的vm和vc
        Vue.mixin({
            data() {
                return {
                    x: 1,
                    y: 2
                }
            }
        })

        //4.给Vue的原型对象添加实例方法,vm和vc都能用
        Vue.prototype.hello = () => { alert('hello!') }
    }
}

export default plusobj;

 3.使用插件Vue.use()

use的作用就是帮忙调用插件对象中的install方法,而且还可以传一些参数给install函数。

//在main.js中引入插件并起个名儿
import plugins from './plugins';
//使用插件,要在new Vue之前使用
Vue.use(plugins, 1, 2, 3);

 八、scoped样式

作用:让样式在局部生效,防止冲突。
写法:<style scoped>

指定使用 less写法:<style lang="less">,不写默认css

备注:
查看webpack所有版本 当前项目文件目录>npm view webpack versions
安装less版本7当前项目文件目录>npm i less-loader@7

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Gin框架 源码解析

https://zhuanlan.zhihu.com/p/136253346 https://www.cnblogs.com/randysun/category/2071204.html 这个博客里其他go的内容也讲的很好 启动 因为 gin 的安装教程已经到处都有了&#xff0c;所以这里省略如何安装&#xff0c; 建议直接去 github 官方地址的 README 中浏览安装…

【数据库基础增删改查】条件查询、分页查询

系列文章目录 &#x1f308;座右铭&#x1f308;&#xff1a;人的一生这么长、你凭什么用短短的几年去衡量自己的一生&#xff01; &#x1f495;个人主页:清灵白羽 漾情天殇_计算机底层原理,深度解析C,自顶向下看Java-CSDN博客 ❤️相关文章❤️&#xff1a;清灵白羽 漾情天…

AI浸入社交领域,泛娱乐APP如何抓住新风口?

2023年是大模型技术蓬勃发展的一年&#xff0c;自ChatGPT以惊艳姿态亮相以来&#xff0c;同年年底多模态大模型技术在国内及全球范围内的全面爆发&#xff0c;即模型能够理解并生成包括文本、图像、视频、音频等多种类型的内容。例如&#xff0c;基于大模型的文本到图像生成工具…

Samtec科普 | 一文了解患者护理应用连接器

【摘要/前言】 通过医疗专业人士为患者提供护理的种种需求&#xff0c;已经不限于手术室与医院的各种安全状况。当今许多患者的护理都是在其他环境进行&#xff0c;例如医生办公室、健康中心&#xff0c;还有越来越普遍的住家。尤其是需要长期看护的患者&#xff0c;所需的科技…

Mysql数据库概念与安装

目录 一、数据库概述 1、数据库的基本概念 2、数据库管理系统&#xff08;DBMS&#xff09; 2.1 数据库管理系统概念 2.2 数据库管理系统工作模式 3、数据库系统&#xff08;DBS&#xff09; 3.1 数据库系统概念 3.2 数据库系统发展史 4、关系型数据库与非关系型数据库…

机器学习——终身学习

终身学习 AI不断学习新的任务&#xff0c;最终进化成天网控制人类终身学习&#xff08;LLL&#xff09;&#xff0c;持续学习&#xff0c;永不停止的学习&#xff0c;增量学习 用线上收集的资料不断的训练模型 问题就是对之前的任务进行遗忘&#xff0c;在之前的任务上表现不好…

【机器学习】无监督学习算法之:K均值聚类

K均值聚类 1、引言2、K均值聚类2.1 定义2.2 原理2.3 实现方式2.4 算法公式2.4.1 距离计算公式2.4.1 中心点计算公式 2.5 代码示例 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c; K均值聚类 我不懂&#xff0c;能不能给我讲一讲&#xff1f; 小鱼&#xff1a;行&#xf…

AI助手 - Fitten Code

前言 上一篇介绍了商汤AI编程小助手小浣熊 Raccoon&#xff0c;过程中又发现了另外一款国产AI编程助手&#xff0c;那就是本篇要介绍的非十科技出品的Fitten Code。 ​ Fitten Code 主打一个快&#xff1a;超高准确率、超快的响应速度。号称代码生成比GitHub Copilot 快两倍&am…

蓝桥杯模块综合——高质量讲解AT24C02,BS18B20,BS1302,AD/DA(PCF8591),超声波模块

AT24C02——就是一个存储的东西&#xff0c;可以给他写东西&#xff0c;掉电不丢失。 void EEPROM_Write(unsigned char * EEPROM_String,unsigned char addr , unsigned char num) {IIC_Start();IIC_SendByte(0xA0);IIC_WaitAck();IIC_SendByte(addr);IIC_WaitAck();while(nu…

奶牛均分

解法&#xff1a; 假设编号从左到右递增&#xff0c;奶牛每次只能去往左边的牛圈。因此等分最大奶牛数小于等于最右边牛圈奶牛数&#xff0c;不妨设数为k&#xff0c;那么a[i]>k&#xff0c;a[i-1]>2k。。。 做后缀和二分答案就可找到k #include<iostream> #inc…

字符串筛选排序 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 输入一个由n个大小写字母组成的字符串&#xff0c; 按照 ASCII 码值从小到大的排序规则&#xff0c;查找字符串中第 k 个最小ASCII 码值的字母(k>1) , 输出该…

CSS学习(3)-浮动和定位

一、浮动 1. 元素浮动后的特点 脱离文档流。不管浮动前是什么元素&#xff0c;浮动后&#xff1a;默认宽与高都是被内容撑开&#xff08;尽可能小&#xff09;&#xff0c;而且可以设置宽 高。不会独占一行&#xff0c;可以与其他元素共用一行。不会 margin 合并&#xff0c;…

C语言易错知识点

1、数组长度及所占字节数 char x[] {"Hello"},y[]{H,e,l,l,o}; x数组的长度为5&#xff0c;y的长度也是5 x、y数组所占字符串为6为 51(\0)6 strlen&#xff08;&#xff09;函数得到的是数组的长度 2、%%与%的优先级 #include<stdio.h> int main(){ int a…

HarmonyOS4.0—自定义渐变导航栏开发教程

前言 今天要分享的是一个自定义渐变导航栏&#xff0c;本项目基于鸿蒙4.0。 先看效果&#xff1a; 这种导航栏在开发中也比较常见&#xff0c;特点是导航栏背景色从透明到不透明的渐变&#xff0c;以及导航栏标题和按钮颜色的变化。 系统的导航栏无法满足要求&#xff0c;我们…

Visual Studio 2013 - 高亮设置括号匹配 (方括号)

Visual Studio 2013 - 高亮设置括号匹配 [方括号] 1. 高亮设置 括号匹配 (方括号)References 1. 高亮设置 括号匹配 (方括号) 工具 -> 选项… -> 环境 -> 字体和颜色 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

基于信号分解的几种一维时间序列降噪方法(MATLAB R2021B)

自适应信号分解算法是一种适合对非平稳信号分析的方法&#xff0c;它将一个信号分解为多个模态叠加的形式&#xff0c;进而可以准确反应信号中所包含的频率分量以及瞬时频率随时间变化的规律。自适应信号分解算法与众多“刚性”方法(如傅里叶变换&#xff0c;小波变换)不同&…

R语言实现多要素偏相关分析

偏相关分析是指当两个变量同时与第三个变量相关时&#xff0c;将第三个变量的影响剔除&#xff0c;只分析另外两个变量之间相关程度的过程&#xff0c;判定指标是相关系数的R值。 在GIS中&#xff0c;偏相关分析也十分常见&#xff0c;我们经常需要分析某一个指数与相关环境参…

浅谈一下对于DDD模式的理解2

浅谈一下对于DDD模式的理解&#xff0c;相互学习交流&#xff0c;不对之处欢迎大家指正。 在说到DDD(Domain-Driven Design)设计模式之前&#xff0c;先要说下我们在对系统进行架构设时需要遵循的几个原则&#xff1a; 单一职责&#xff08;SRP&#xff09; "单一职责原则…

原来这才是帕金森症状得到缓解的秘诀!

帕金森是一种影响神经系统的慢性疾病&#xff0c;主要症状包括震颤、肌肉僵硬和运动缓慢。如不及时治疗控制&#xff0c;症状可能会逐渐加重&#xff0c;严重影响生活质量。患者可能丧失自理能力&#xff0c;出现跌倒、骨折等并发症&#xff0c;还可能伴随认知障碍和情绪问题。…

考研数学|汤家凤《1800题》什么阶段做?值不值得做?

1800总的来说还是一本对基础不太好的同学一本不错的习题册&#xff0c;当然他可能对基础较好的同学来说题目量过大 考研数学备考&#xff0c;刷1800题是否必要&#xff1f;从我的经验来看&#xff0c;刷1800题并不是绝对必要的&#xff0c;而且传统习题册存在一些问题&#xf…