Vue的$mount做了什么

Vue的$mount做了什么,第1张

这个文件就是要扩展$mount:

因为数据选项中可能存在的template和el

先判断options中是否有render,再判断是否有template,最后才判断是否有el;因此得出的结论是render优先级大于template、template优先级大于el

在判断template的时候再判断template中是写的“#app"还是 '<div>template</div>' 节点;最后把template选项处理成 render 函数

如果没有render没有template最后就会执行 mountcall(this, el, hydrating)

因为 const mount = Vueprototype$mount 所以要找Vue

至此 $mount 的浅显功能就清楚了:

看了mountComponent的源码明白了,先执行$mount => 然后执行_render() => 最后执行 _update()(这个才是把虚拟dom变成真实dom的执行者);

另外还应该明白的是一个组件有一个watcher。

这里应该明白$mount有更新有初始化,

patch: 将vnode =》 node

patch 里边有两个分支,一个是初始化,一个是更新

真正实现$mount方法

$mount:生成真是dom,这里边一定会调用render和patch

如果想更近一步了解$mount在初始化和更新环节做了啥请看 vue的diff算法

在以往的工作当中,通常会遇到需要处理 DOM 的时候, DOM *** 作属于一个常规的范畴,我们可能需要通过它绑定一个事件、调整滚动条的位置、管理焦点、文本选择、媒体播放等等。

基于工程页面、逻辑复杂性、复用性等等因素可以选择合适的方案方便我们 *** 作 DOM 。

在页面比较简单和逻辑并不复杂的时候,我们可以根据实际情况选择比较简单的选择器方案;当工程逻辑较复杂的时候,我们要考虑组件的复用性、多人协作的不可控性等多种因素,选择方案的时候往往要考虑更多可能的场景。

如上所述,如果我们的使用场景单一,不需要复用的话,我们可以保证获取的 DOM 一致性的时候,可以考虑使用选择器获取 DOM 。

可以使用 documentgetElementXX 开头的方法:

可使用方法如下:

实际使用场景:

页面逻辑复杂的时候会有复用性的问题,如果使用 id 或者选择器就容易引发问题,这时我们可以选择使用 ref 。

ref 可以获取到相应的 DOM 节点,而且也可以得到详细信息,它得到的一个对象,包括 props,state 等。

React 会在组件挂载时给 current 属性传入 DOM 元素,并在组件卸载时传入 null 值。 ref 会在 componentDidMount 或 componentDidUpdate 生命周期钩子触发前更新。

ref 的值根据节点的类型而有所不同:

React 也支持另一种设置 refs 的方式,称为“回调 refs”。

不同于传递 createRef() 创建的 ref 属性,你会传递一个函数。这个函数中接受 React 组件实例或 HTML DOM 元素作为参数,以使它们能在其他地方被存储和访问。

React 将在组件挂载时,会调用 ref 回调函数并传入 DOM 元素,当卸载时调用它并传入 null。在 componentDidMount 或 componentDidUpdate 触发前,React 会保证 refs 一定是最新的。

父组件想要 *** 作子组件且没有控制权的时候可以选择使用 findDOMNode 。

findDOMNode 只在已挂载的组件上可用(即:已经存在 DOM 中的组件)。如果尝试调用未挂载的组件将会引发异常。

findDOMNode 不能用于函数组件。

如果组件已经被挂载到 DOM 上,此方法会返回浏览器中相应的原生 DOM 元素。此方法对于从 DOM 中读取值很有用,例如获取表单字段的值或者执行 DOM 检测。

当组件渲染的内容为 null 或 false 时,findDOMNode 也会返回 null。当组件渲染的是字符串时,findDOMNode 返回的是字符串对应的 DOM 节点。从 React 16 开始,组件可能会返回有多个子节点的 fragment,在这种情况下,findDOMNode 会返回第一个非空子节点对应的 DOM 节点。

在linux系统中,可以使用mount命令挂载光盘镜像文件、移动硬盘、U盘以及Windows网络共享和UNIX

NFS网络共享等。

命令格式:

mount

[-t

vfstype]

[-o

options]

device

dir

参数说明:

①-t

vfstype

指定文件系统的类型,通常不必指定。mount

会自动选择正确的类型。常用类型有:

光盘或光盘镜像:iso9660

DOS

fat16文件系统:msdos

Windows

9x

fat32文件系统:vfat

Windows

NT

ntfs文件系统:ntfs

Mount

Windows文件网络共享:smbfs

UNIX(LINUX)

文件网络共享:nfs

②-o

options

主要用来描述设备或档案的挂接方式。常用的参数有:

loop:用来把一个文件当成硬盘分区挂接上系统

ro:采用只读方式挂接设备

rw:采用读写方式挂接设备

iocharset:指定访问文件系统所用字符集

③device

要挂接(mount)的设备

④dir设备在系统上的挂接点(mount

point)

案例分析:

光盘镜像文件的挂接(mount)

mkdir /mnt/vcdrom

#建立一个目录用来作挂接点(mount point)

mount -o loop -t iso9660 /home/sunky/mydiskiso /mnt/vcdrom

#使用/mnt/vcdrom就可以访问盘镜像文件mydiskiso里的所有文件

1第一种,最常见vue-cli模板就是这样

import Vue from 'vue'

import App from '/App'

new Vue({

    el: '#app',                                  //#app 元素的 outerHTML 是 Vue 模板,该模板可以被编译成 render function。

    template: '<App/>',

    components: { App }

})

2第二种,这种挂载是直接挂载到入口文件indexhtml 的 id=app 的dom 元素上

new Vue({

    router,

    store,

})$mount('#app')       

3第三种,

new Vue({

    router,

    store,

    render: h => h(App)

})$mount('#app')

4第四种,

new Vue({

     el:'#app',  

     router,  

     render: h =>h(App)

})

 5第五种:

var options = {

    el: '#app',

     store,

     router,

     App

};

new Vue(options)

$mount()用于手动挂载

当Vue实例没有el属性时,则该实例尚没有挂载到某个dom中假如需要延迟挂载,可以在之后手动调用vm$mount()方法挂载。

例如:newVue({router,render:h=>h(App)})$mount("#app");

render: x => x(App)// 这里的render: x => x(App)是es6的写法// 

转换过来就是: 暂且可理解为是渲染App组件// 

render:(function(x){// return x(App);// });

课程目标

理解react的框架使用中,真实dom存在的意义。

使用真实dom和使用虚拟dom的场景。

灵活掌握并能够合理使用 *** 作真实dom的方法。

知识点

react中提供了ref这个属性来获取原生的dom节点,使用方式:在虚拟dom中添加ref属性,即可在组件实例的refs属性中获取该真实dom节点。由于组件实例化的时候,真实dom节点是在最后才生成的。所以,我们获取真实dom节点应该是在componentDidMount这个生命周期中。

class HelloWorld extends Component{

render(){

return <div>

<h1 ref="h">hello world</h1>

</div>

}

componentDidMount(){

consolelog(thisrefsh); // 打印的是h1这个dom节点。

}

}

ref也可以使用在组件标签上使用,此时获取的是该组件标签的组件实例。如下:

class Button extends Component{

render(){

return <button>确定</button>

}

}

let btn = ReactcreateElement()

propsref function

propsref(btn)

class HelloWrold extends Component{

getBtnThis = btn => {

consolelog(btn) // Button组件的第二个组件实例

}

render(){

return <div>

<Button ref="btn"></Button>

/

let btn = new Button()

btnref === typeof function

btnref(btn)

}

findDomNode这个方法可以根据组件实例(每个组件实例都对应的有一段dom节点获取该组)件实例所对应的真实dom节点。该方法的使用如下

/

context 一个组件的组件实例

dom 该组件实例所对应的真实dom节点。

/

const dom = ReactfindDomNode(context);

unmountComponentAtNode该方法的作用是:从 DOM 中移除已经挂载的 React 组件,清除相应的事件处理器和 state。如果在 container 内没有组件挂载,这个函数将什么都不做。如果组件成功移除,则返回 true;如果没有组件被移除1,则返回 false。

const result = ReactunmountComponentAtNode(DOMElement container)

掌握在什么情况下需要真实的dom节点;react的虚拟dom不能实现的原生dom的api的情况,比如:文本框自动聚焦,音频视频相关的api,获取元素的宽高和位置等。基本原则是:能不用真实dom节点尽量不用,实在不能用虚拟dom的时候,才使用真实dom节点。再一种情况是,现有的一些库是针对dom *** 作而构建的,那么想要把这些库和react结合在一起,就必须要使用真实dom节点,比如swiper betterScroll echarts等等。

授课思路

重点参考:

(Good) 如何利用mount命令挂载另一台服务器上的目录

>

1、windows系统中文件夹属性中设置文件共享

2、挂载,linux系统执行共享命令

注意:(使用mount挂载的方法在系统重新启动后就会失效)

usrname:访问共享文件夹的用户名

password:访问密码

ip:共享文件夹所在主机ip

sharename:共享文件夹目录名字

name:需要挂载的linux完整文件夹路径

cifs:Common Internet File System,可以理解为网络文件系统。

3、取消挂载

注意:

name:已经挂载的linux完整文件夹路径

如果umount的时候显示 device busy?

这是因为有程序正在访问这个设备,则可以用:

也可以使用命令ps aux 来查看占用设备的程序PID,然后用命令kill来杀死占用设备的进程,然后再取消挂载

以上就是关于Vue的$mount做了什么全部的内容,包括:Vue的$mount做了什么、React 中 *** 作 DOM 的方法、关于linux中mount的命令等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9320711.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存