当前位置: 首页 > Web前端 > vue.js

Vue3亲身体验---功能详解(六)模板参考ref

时间:2023-04-01 11:53:20 vue.js

ref原来对DO??M的操作是通过ID和getElementById方法操作的,如下:ref不需要使用getElementById直接使用ref名称对DOM进行操作,如下:import{ref}from'vue'constitemR=ref()functionuu(){console.log(itemR.value)}//直接使用ref名操作DOMref的写法template部分通过标签的ref属性给DOM分配一个标识符可选的API操作这个标识的DOM通过$fefs对象进行引用。$refs.Identifier组合API,使用在onMounted中成功操作DOM,如下:ref标识名1、字符类型标识模板部分ref赋值标识是一个字符,逻辑部分定义了同名标识,用来存放这个DOM对象,如上所有例子都是字符标识。当存在同名标识符时,逻辑部分的同名标识符只存储最后一个同名的DOM对象。如下:2。数组类型标识符只存在于v-for创建的ref中。逻辑部定义了同名的标识符,但是这个标识符是一个数组,里面存放的是v-forMultipleDOM对象创建的ref,如下:3.可以使用变量标识v-bind将ref属性绑定到一个响应变量上,逻辑部门需要定义响应变量的值,用于存储DOM对象。如下:注意上面的例子,wocao的值应该是oneRef和twoRef被定义为存储DOM

  • Thisrefisnotanotherreftemplatereference。虽然模板引用中的ref和响应变量ref的定义方式相同,但是这两个ref的性质是完全不同的。1、响应变量ref定义时,可以赋值“constwocao=ref('oneRef')”或者重新赋值“wocao.value=twoRef”,这才是真正的值。2、模板引用的ref的值默认为DOM对象。上面定义“constwocao=ref()”后,wocao的值为
  • ,一直用来存放DOM对象
  • ,重新赋值给它无效。引用ref1标识的DOM。在逻辑部分,通过“identifier.value”来引用DOM,所以所有的DOM操作都可以通过这个identifier.value来实现。1.通过identifier.value:"identifier.value.parentNode"操作其他DOM获取本DOM的父节点;获取第一个子节点:“identifier.value.firstChild”;获取最后一个子节点:“identitycharacter.value.lastChild”。操作其他DOM的属性和方法有很多,这里就不一一列举了。2、使用identifier.value操作这个DOM的属性来添加属性:“identifier.value.setAttribute('a','b')”,注意a和b必须用引号;取属性值:“identifier.value.Attributename”,如果要取标签的ID属性,可以这样做:identifier.value.id注意:以上方法只能取标签的默认属性值系统。如果是自定义属性,则需要使用getAttribute("自定义属性名称")方法获取属性值。如下:系统自身属性“id”的提取方式:wo.value.id自定义属性“zid”的提取方式:wo。价值。getAttribute("zid")获取不到ref的属性:比如wo.value.ref,获取不到wo的ref的值。不知有没有高手指教?请在本文下留言,非常感谢。获取这个DOM的内容:“Identifier.value.innerHTML”(会取出子的text和html代码);“Identifier.value.textContent”(只提取自身和child的文本内容)以及很多操作这个DOM的属性和方法,这里就不一一举例了。2.在模板部分使用v-html或者动态组件引用DOM。如果模板部分不能使用{{identifier}}来引用DOM,网页会显示:“[objectHTMLButtonElement]”。要在模板部分引用DOM,需要特殊方法如下:如上,采用了两种引用方式1、v-html方式通过将DOM封装到其他标签的v-html指令值中实现DOM引用:
  • 2.动态组件方式通过将DOM封装成动态组件实现DOM引用:注意":is='wq'"wq值的规范必须符合组件的写法:“{template:DOM}”,必须写在{}大括号内,并使用template属性如:{template:wowo.value.outerHTML}如果template:属性无效,这个这是因为构建不支持模板选项,需要开启支持。方法是:在根目录下的vite.config.js文件中添加如下语句(Vue3+vite架构)(Vue3+vite架构)import{defineConfig}from'vite'importpathfrom"path";exportdefaultdefineConfig({resolve:{alias:{'vue':path.resolve(__dirname,"node_modules/vue/dist/vue.esm-bundler.js")},}})注意vue.esm-bundler.js文件路径的准确性,否则不生效。生命周期问题的解决方案1.outerHTML属性的逻辑部分使用“logo.value”作为对DOM的引用。要在模板部分以html格式显示DOM,需要使用outerHTML属性。它的作用是导出DOMForlabel形式的完整html,逻辑部分的格式为:“logo.value.outerHTML”,模板部分的格式为:“identifier.outerHTML”。2、DOM渲染机制DOM会在网页渲染前的初始阶段初始化DOM标签中的属性值。此时,“identifier.outerHTML”仍然是一个空对象,因为“identifier”没有outerHTML属性。渲染时,后台会弹出“outerHTMLattributeisundefined”警告,网页崩溃。所以包装它以避免在初始化时使用outerHTML属性。3、响应式API+if使用if(logo.value){}包裹outerHTML属性,只有当“logo.value”有值时才读取outerHTML属性,如下:if(wowo.value){returnwowo.value.outerHTML}这个响应式API将被执行两次,一次是在初始化期间。因为“logo.value”为空,“读取outerHTML属性”不会被执行。当获取到DOM值后,会再次执行API,执行“读取outerHTML属性”。上面的例子中,分别使用了function、computed、watch来封装outerHTML属性。注意watch初始化时不会运行,只有DOM值改变时才会运行,所以不需要if(logo.value){}语句。子项(组件中由ref标识的DOM)被传递给父项。1.直接传递父组件也可以在子组件中引用ref标识的DOM。1、可选的API操作语句引用DOM:this.$refs.subcomponentidentifier.$refs.DOMidentifier在子组件中引用数据:this.$refs.subcomponentidentifier.$refs.inthesubcomponent变量引用函数:this.$refs.subcomponentidentifier.$refs.如何在模板部门的子组件中使用b函数?不想研究2.组合API+子组件