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

news2024/11/26 8:39:14

一、脚手架结构分析

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

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

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

相关文章

利用WebGL绘制简单几何

利用WebGL绘制最简单的几何图形 一、WebGL简介 WebGL是一种用于在网页上渲染交互式3D和2D图形的JavaScript API。它基于OpenGL ES 2.0&#xff0c;提供了一种在浏览器中使用硬件加速图形的方式。 二、图形系统绘图流程 图形系统的通用绘图流程会包括六个部分&#xff1a; …

python_django网红基地孵化园场地管理系统flask

作为一个管理孵化园的网络系统&#xff0c;数据流量是非常大的&#xff0c;所以系统的设计必须满足使用方便&#xff0c;操作灵活的要求。所以在设计孵化园管理系统管理系统应达到以下目标&#xff1a; &#xff08;1&#xff09;界面要美观友好&#xff0c;检索要快捷简易&…

python问题:vscode切换环境,pip安装库网络错误,不使用anaconda安装库

python问题&#xff1a;vscode切换环境&#xff0c;pip安装库网络错误 vscode切换环境pip安装库网络错误 不使用anaconda安装库 记录一下遇见的python问题。 vscode切换环境 在vscode上面的搜索框输入 > select interpreter然后选择需要的环境。 pip安装库网络错误 用…

数据丢失怎么办?不可不知道的3个恢复方法分享!

“作为一名电脑小白&#xff0c;刚买了电脑后我就把所有学习资料都保存在电脑上了&#xff0c;刚刚发现有部分比较重要的数据找不到了&#xff0c;我应该怎么操作才能恢复这些文件呢&#xff1f;” 数据丢失&#xff0c;对于任何个人或企业来说&#xff0c;都是一件令人头疼的事…

Python学习从0到1 day17 Python异常、模块、包

不走心的努力&#xff0c;都是在敷衍自己 ——24.3.19 万字长文&#xff0c;讲解异常、模块、包&#xff0c;看这一篇就足够啦 什么是异常? 当检测到一个错误时&#xff0c;python解释器就无法继续执行了&#xff0c;反而出现了一些错误的提示&#xff0c;这就是所谓的异常&am…

「滚雪球学Java」:安全(章节汇总)

&#x1f3c6;本文收录于「滚雪球学Java」专栏&#xff0c;专业攻坚指数级提升&#xff0c;助你一臂之力&#xff0c;带你早日登顶&#x1f680;&#xff0c;欢迎大家关注&&收藏&#xff01;持续更新中&#xff0c;up&#xff01;up&#xff01;up&#xff01;&#xf…

代码随想录day26(1)二叉树:二叉搜索树的最小绝对差(leetcode530)

题目要求&#xff1a;给你一棵所有节点为非负值的二叉搜索树&#xff0c;请你计算树中任意两节点的差的绝对值的最小值。 思路&#xff1a;最简单的想法就是新建数组&#xff0c;通过中序遍历将节点值全都存入数组中&#xff08;有序&#xff09;&#xff0c;然后计算相邻两节…

【堡垒机】企业购买堡垒机的七大需求你知道吗?

目前想了解堡垒机的企业越来越多了&#xff0c;采购堡垒机的企业也越来越多了。那企业购买堡垒机的七大需求你知道吗&#xff1f;今天我们小编就跟大家一起来探讨一下&#xff0c;仅供参考哦&#xff01; 企业购买堡垒机的七大需求 需求1、简化运维流程&#xff0c;提高运维工…

【Docker】-- 如何安装docker

一、安装docker 首先要安装一个yum工具 yum install -y yum-utils 安装成功后&#xff0c;执行命令&#xff0c;配置Docker的yum源&#xff1a; yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 最后&#xff0c;执行命令&#x…

MySQL中replace into详解、批量更新、不存在插入存在则更新、replace into的坑

文章目录 一、replace into原理二、replace into的三种形式三、replace into 使用案例3.1、replace into values3.1.1、只有主键且主键冲突3.1.2、有主键有唯一索引且主键冲突3.1.3、有主键有唯一索引且唯一索引冲突(有坑)3.1.4、有主键有唯一索引且与一条主键冲突与另一条唯一…

centos7磁盘管理,lvm挂载、扩容

一、centos7 磁盘挂载 默认盘符格式 centos7 默认文件格式xfscentos6 默认文件格式ext4centos5 默认文件格式ext3 1、/dev/vdb和/dev/mapper/lvm-data对比 1&#xff09;/dev/vdb /dev/vdb通常表示一个裸的块存储设备&#xff0c;比如一个硬盘或者虚拟机中的一个虚拟硬盘。…

c语言综合练习题

1.编写程序实现键盘输入一个学生的学分绩点 score&#xff08;合法的范围为:1.0—5.0&#xff09;&#xff0c;根据学生的学分绩点判定该学 生的奖学金的等级&#xff0c;判定规则如下表所示。 #include <stdio.h>int main() {float score;printf("请输入学生的学分…

在Arm 虚拟硬件(AVH)部署深度学习OCR算法

AI算法的嵌入式部署 AI算法在独立的设备上运行其实就是行业内的嵌入式AI的概念, 大致过程如下: 开发AI模型, 2.对数据集进行处理, 3.训练AI模型并验证效果, 4.转成ONNX格式(ONNX:万金油中间格式,给模型优化和部署带来了更多可能性)或者借助libtorch或者TensorFlow来部署C++版…

FreeRTOS时间片调度

1. 时间片调度简介 同等优先级任务轮流地享有相同的 CPU 时间(可设置)&#xff0c; 叫时间片。在FreeRTOS中&#xff0c;一个时间片就等于SysTick 中断周期。 像我们的源码&#xff0c;滴答定时器是 1ms 中断一次&#xff0c;那么一个时间片的时间就是 1ms。可设置&#xff1a…

如何选择一款靠谱的短网址工具,避坑指南

选择一款靠谱的短网址服务是非常重要的。这不仅关乎到你的个人体验&#xff0c;更直接影响到你的业务发展和流量转化。想象一下&#xff0c;你精心策划了一场营销活动&#xff0c;通过短网址分享给了众多用户&#xff0c;然而因为短网址服务的不稳定&#xff0c;用户无法打开链…

多个线程交替打印ABC

多个线程交替打印ABC package 多个线程交替打印ABC;import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier;/*** Created with IntelliJ IDEA.** Author: AlenXu* Date: 2024/03/20/10:10* Description:*/ public class ThreadLoopP…

Hack The Box-Devvortex

目录 信息收集 nmap whatweb WEB web信息收集 wfuzz 漏洞探索 漏洞发现 反弹shell 提权 get user hashcat get root 信息收集 nmap 端口信息收集┌──(root?ru)-[~/kali/hackthebox] └─# nmap -p- 10.10.11.242 --min-rate 10000 Starting Nmap 7…

javase Set集合

Collection子接口2&#xff1a;Set 5.1 Set接口概述 Set接口是Collection的子接口&#xff0c;Set接口相较于Collection接口没有提供额外的方法 Set 集合不允许包含相同的元素&#xff0c;如果试把两个相同的元素加入同一个 Set 集合中&#xff0c;则添加操作失败。 Set集合…

红黑树简单介绍

1. 概念介绍 红黑树是一种自平衡二叉查找树&#xff0c;由于自平衡的特性&#xff0c;保证了最坏情况下在O&#xff08;logn&#xff09;时间复杂度内完成查找、增加、删除等操作&#xff0c;性能表现稳定。 在JDK中&#xff0c;TreeMap、TreeSet以及JDK1.8的HashMap底层都采用…

数据之王国:解析Facebook的大数据应用

引言 作为全球最大的社交媒体平台之一&#xff0c;Facebook拥有庞大的用户群体和海量的数据资源。这些数据不仅包括用户的个人信息和社交行为&#xff0c;还涵盖了广告点击、浏览记录等多方面内容。Facebook通过巧妙地利用这些数据&#xff0c;构建了强大的大数据应用系统&…