案例-商品列表(组件封装)

  

标签组件封装


1.双击显示,自动聚焦

2.失去焦点,隐藏输入框
标签一列,不同行的标签内容不同,但是除此之外其他基本一致,所以选择用 标签组件 将这一部分封装为一个组件,需要时组件标签展示。

首先标签处一进去就是显示的 “茶具” 双击之后才显示输入框。所以输入框和 “茶具”的显示两者是互斥的,用 v-if 和 v-else 来控制。

v-if 传值为“isEdit” 如果为 false 就显示 “茶具”,(最初定义的就是false,也就是一开始进去就是 “茶具”,什么时候会变为true继而显示输入框呢),给v-else 也就是“茶具”所在的元素注册一个双击事件,双击之后 isEdit由false变为true,就会显示输入框了。

接下来是聚焦,想要实现的是双击“茶具”出现输入框之后就自动进行聚焦。开始做法是给输入框dom元素添加ref属性,在显示输入框之后this.isEdit=true,通过$refs立刻获取焦点。但是vue是异步更新,输入框显示但是dom并没有进行更新,所以出错。这时,通过$nextTick检测dom元素更新完成之后就立刻获取焦点。

每次想要实现聚焦效果都要写这一段代码,很是麻烦,可以将这个效果进行指令封装,并全局注册,需要时直接添加指令即可。




输入框和茶具不能一同显示,两个是互斥关系,用v-if和v-else



指令封装,dom元素插入页面自动聚焦

或者



输入框失去焦点(显示茶具)



App.vue

<template><div class="table-case"><table class="my-table"><thead><tr><th>编号</th><th>名称</th><th>图片</th><th width="100px">标签</th></tr></thead><tbody><tr><td>1</td><td>梨皮朱泥三绝清代小品壶经典款紫砂壶</td><td><img src="https://yanxuan-item.nosdn.127.net/f8c37ffa41ab1eb84bff499e1f6acfc7.jpg" /></td><td><!-- 标签组件 --><MyTag></MyTag></td></tr><tr><td>1</td><td>梨皮朱泥三绝清代小品壶经典款紫砂壶</td><td><img src="https://yanxuan-item.nosdn.127.net/221317c85274a188174352474b859d7b.jpg" /></td><td><!-- 标签组件 --><MyTag></MyTag></td></tr></tbody></table></div>
</template><script>
// my-tag 标签组建的封装
//  1.创建组件 - 初始化
//  2.实现功能
//    (1)双击显示,并且自动聚焦 
//       v-if v-else @dbclick 
//       &nextTick =>$refs获取到dom ,进行focus获取焦点
//       封装v-focus指令
//     (2)失去焦点,隐藏输入框
//     (3)回显标签信息
//     (4)内容修改了,回车 =》 修改标签信息import MyTag from './components/MyTag.vue'
export default {name: 'TableCase',components: {MyTag,},data() {return {goods: [{id: 101,picture:'https://yanxuan-item.nosdn.127.net/f8c37ffa41ab1eb84bff499e1f6acfc7.jpg',name: '梨皮朱泥三绝清代小品壶经典款紫砂壶',tag: '茶具',},{id: 102,picture:'https://yanxuan-item.nosdn.127.net/221317c85274a188174352474b859d7b.jpg',name: '全防水HABU旋钮牛皮户外徒步鞋山宁泰抗菌',tag: '男鞋',},{id: 103,picture:'https://yanxuan-item.nosdn.127.net/cd4b840751ef4f7505c85004f0bebcb5.png',name: '毛茸茸小熊出没,儿童羊羔绒背心73-90cm',tag: '儿童服饰',},{id: 104,picture:'https://yanxuan-item.nosdn.127.net/56eb25a38d7a630e76a608a9360eec6b.jpg',name: '基础百搭,儿童套头针织毛衣1-9岁',tag: '儿童服饰',},],}},
}
</script><style lang="less" scoped>
.table-case {width: 1000px;margin: 50px auto;img {width: 100px;height: 100px;object-fit: contain;vertical-align: middle;}.my-table {width: 100%;border-spacing: 0;img {width: 100px;height: 100px;object-fit: contain;vertical-align: middle;}th {background: #f5f5f5;border-bottom: 2px solid #069;}td {border-bottom: 1px dashed #ccc;}td,th {text-align: center;padding: 10px;transition: all 0.5s;&.red {color: red;}}.none {height: 100px;line-height: 100px;color: #999;}}}
</style>

MyTag.vue

<template>
<div class="my-tag"><input v-if="isEdit"v-focusref="inp"class="input"type="text"placeholder="输入标签"@blur="isEdit = false"/><div v-else @dblclick="handleClick" class="text">茶具</div>
</div>
</template><script>
export default {data(){return {isEdit:false,}},methods:{handleClick(){// 双击后切换到显示状态(输入框)this.isEdit = true// // // 通过ref找到元素,立刻获取焦点// // this.$refs.inp.focus()// // 异步更新,切换到显示状态后,dom并没有进行更新,立即获取焦点实际是获取不到的// // 等dom更新王再获取焦点// this.$nextTick(() => {//   this.$refs.inp.focus()// })// // 每次都要点focus进行获取焦点很麻烦,可以将这套指令封装为指令,在main.js中进行全局注册}}}
</script><style lang="less" scoped>.my-tag {cursor: pointer;.input {appearance: none;outline: none;border: 1px solid #ccc;width: 100px;height: 40px;box-sizing: border-box;padding: 10px;color: #666;&::placeholder {color: #666;}}}</style>

main.js





3.回显标签信息

4.内容修改了,回车 =>修改标签信息

回显的标签信息是父组件传递过来的,在data中定义数据tempText,在子组件标签中通过v-model帮绑定该数据,子组件中通过props接收该数据值value,显示为还未双击之前的值,双击之后输入框出现,显示为输入框回显的值 :value="value"。

修改输入框中的内容回车之后希望显示修改后的内容。也就是将修改后的数据传送到父组件,父组件再传送回子组件进行显示。通过键盘回车绑定事件,将用户输入数据传送回父组件,e.target能拿到事件源,也就是dom元素,e.target.value能拿到用户输入的值。


App.vue

<template><div class="table-case"><table class="my-table"><thead><tr><th>编号</th><th>名称</th><th>图片</th><th width="100px">标签</th></tr></thead><tbody><tr><td>1</td><td>梨皮朱泥三绝清代小品壶经典款紫砂壶</td><td><img src="https://yanxuan-item.nosdn.127.net/f8c37ffa41ab1eb84bff499e1f6acfc7.jpg" /></td><td><!-- 标签组件 --><MyTag v-model="tempText"></MyTag></td></tr><tr><td>1</td><td>梨皮朱泥三绝清代小品壶经典款紫砂壶</td><td><img src="https://yanxuan-item.nosdn.127.net/221317c85274a188174352474b859d7b.jpg" /></td><td><!-- 标签组件 --><MyTag></MyTag></td></tr></tbody></table></div>
</template><script>
// my-tag 标签组建的封装
//  1.创建组件 - 初始化
//  2.实现功能
//    (1)双击显示,并且自动聚焦 
//       v-if v-else @dbclick 
//       &nextTick =>$refs获取到dom ,进行focus获取焦点
//       封装v-focus指令
//     (2)失去焦点,隐藏输入框//     (3)回显标签信息
//        回显的标签信息是父组件传递过来的
//        v-model实现功能(简化代码) v-model => :value 和 @input(事件监听)
//        组件内部通过props接收,:value设置给输入框
//     (4)内容修改了,回车 =》 修改标签信息
//         @keyup.enter,触发事件$emit('input',e.target.value)import MyTag from './components/MyTag.vue'
export default {name: 'TableCase',components: {MyTag,},data() {return {// 测试组件功能临时数据tempText:'茶壶', //希望子组件内容能跟这个数据进行双向绑定,这里传入啥,子组件就显示啥;子组件回车又能修改到这里的数据goods: [{id: 101,picture:'https://yanxuan-item.nosdn.127.net/f8c37ffa41ab1eb84bff499e1f6acfc7.jpg',name: '梨皮朱泥三绝清代小品壶经典款紫砂壶',tag: '茶具',},{id: 102,picture:'https://yanxuan-item.nosdn.127.net/221317c85274a188174352474b859d7b.jpg',name: '全防水HABU旋钮牛皮户外徒步鞋山宁泰抗菌',tag: '男鞋',},{id: 103,picture:'https://yanxuan-item.nosdn.127.net/cd4b840751ef4f7505c85004f0bebcb5.png',name: '毛茸茸小熊出没,儿童羊羔绒背心73-90cm',tag: '儿童服饰',},{id: 104,picture:'https://yanxuan-item.nosdn.127.net/56eb25a38d7a630e76a608a9360eec6b.jpg',name: '基础百搭,儿童套头针织毛衣1-9岁',tag: '儿童服饰',},],}},
}
</script><style lang="less" scoped>
.table-case {width: 1000px;margin: 50px auto;img {width: 100px;height: 100px;object-fit: contain;vertical-align: middle;}.my-table {width: 100%;border-spacing: 0;img {width: 100px;height: 100px;object-fit: contain;vertical-align: middle;}th {background: #f5f5f5;border-bottom: 2px solid #069;}td {border-bottom: 1px dashed #ccc;}td,th {text-align: center;padding: 10px;transition: all 0.5s;&.red {color: red;}}.none {height: 100px;line-height: 100px;color: #999;}}}
</style>

MyTag.vue

<template>
<div class="my-tag"><!-- v-model不能跟父组件传递过来的数据进行直接绑定,一旦绑定,就相当于直接在修改父组件传递过来的数据,子组件泵你直接修改父组件传递过来的数据 --><!--  :value="value"相当于父组件传递过来什么值,子组件就显示什么值并进行绑定,该值就回显了 --><input v-if="isEdit"v-focusref="inp"class="input"type="text"placeholder="输入标签"@blur="isEdit = false":value="value"@keyup.enter="handleEnter"/><div v-else @dblclick="handleClick" class="text"><!-- 茶具 -->{{ value }}</div>
</div>
</template><script>
export default {props:{value:String,},data(){return {isEdit:false,}},methods:{handleClick(){// 双击后切换到显示状态(输入框)this.isEdit = true// // // 通过ref找到元素,立刻获取焦点// // this.$refs.inp.focus()// // 异步更新,切换到显示状态后,dom并没有进行更新,立即获取焦点实际是获取不到的// // 等dom更新王再获取焦点// this.$nextTick(() => {//   this.$refs.inp.focus()// })// // 每次都要点focus进行获取焦点很麻烦,可以将这套指令封装为指令,在main.js中进行全局注册},handleEnter(e){// 非空处理if (e.target.value.trim() === '') return alert('标签不能为空')// 需要子传父,回车时,输入框的内容提交给父组件更新,// 父组件是v-model,触发事件,需要触发input事件this.$emit('input',e.target.value)// 或者this.$refs.inp.value// e.target拿到的是触发事件的事件源,也就是dom元素,想拿到输入框输入的值,直接.value就是了// 提交完成,关闭输入状态}}}
</script><style lang="less" scoped>.my-tag {cursor: pointer;.input {appearance: none;outline: none;border: 1px solid #ccc;width: 100px;height: 40px;box-sizing: border-box;padding: 10px;color: #666;&::placeholder {color: #666;}}}</style>

my-table表格组件封装

表格中表头和中间体不能写死,类似的表格还有很多,可以复用。

中间体:表格组件中接收父组件传过来的数据,进行遍历显示。因为该部分不能固定着,以便将来能复用,所以将该部分td表格中的内容用slot具名插槽进行占位,并将td表格中内容剪切到父组件的表格组件标签中,用template标签接收插槽名。还因为该部分遍历的数据item和index在表格组件里,所以需要用slot以属性的方式将这两个数据打包成对象传到父组件,父组件直接解构接收。


表头:直接将标头的内容剪切到父组件的子组件标签中,并在子组件中使用具名插槽占位


并且在表格组件标签的“标签”一列显示 MyTag标签组件标签,将其v-model绑定的数据改为item中的tag

App.vue

<template><div class="table-case"><MyTable :data="goods"><tempalte :slot="head"><th>>编号</th><th>>图片</th><th>>名称</th><th width="100px">标签</th></tempalte><template #body="{item,index}"><td>{{ index+1 }}</td><td>{{ item.name }}</td><td><img :src="item.picture" /></td><td><!-- 标签组件 --><MyTag v-model="item.tag"></MyTag></td></template></MyTable></div>
</template><script>
// my-tag 标签组建的封装
//  1.创建组件 - 初始化
//  2.实现功能
//    (1)双击显示,并且自动聚焦 
//       v-if v-else @dbclick 
//       &nextTick =>$refs获取到dom ,进行focus获取焦点
//       封装v-focus指令
//     (2)失去焦点,隐藏输入框//     (3)回显标签信息// 回显的标签信息是父组件传递过来// v-moedl实现功能(简化代码) v-model => :value 和 @input// 组件内部通过props接收,:value设置给输入框
//     (4)内容修改了,回车 =》 修改标签信息// @keyup.enter,触发事件$emit('input',r.target.value)// my-tag 表格组件的封装
// 1.数据不能写死,动态传递表格渲染的数据
// 2.结构不能写死 - 多处结构自定义// (1)表头支持自定义// (2)主体支持自定义
import MyTag from './components/MyTag.vue'
import MyTable from './components/MyTable.vue'export default {// 测试组件功能临时文本tempText:'茶壶',name: 'TableCase',components: {MyTag,MyTable,},data() {return {goods: [{id: 101,picture:'https://yanxuan-item.nosdn.127.net/f8c37ffa41ab1eb84bff499e1f6acfc7.jpg',name: '梨皮朱泥三绝清代小品壶经典款紫砂壶',tag: '茶具',},{id: 102,picture:'https://yanxuan-item.nosdn.127.net/221317c85274a188174352474b859d7b.jpg',name: '全防水HABU旋钮牛皮户外徒步鞋山宁泰抗菌',tag: '男鞋',},{id: 103,picture:'https://yanxuan-item.nosdn.127.net/cd4b840751ef4f7505c85004f0bebcb5.png',name: '毛茸茸小熊出没,儿童羊羔绒背心73-90cm',tag: '儿童服饰',},{id: 104,picture:'https://yanxuan-item.nosdn.127.net/56eb25a38d7a630e76a608a9360eec6b.jpg',name: '基础百搭,儿童套头针织毛衣1-9岁',tag: '儿童服饰',},],}},
}
</script><style lang="less" scoped>
.table-case {width: 1000px;margin: 50px auto;img {width: 100px;height: 100px;object-fit: contain;vertical-align: middle;}}
</style>

MyTable.vue

<template><table class="my-table"><thead><tr><slot name="head"></slot></tr></thead><tbody><tr v-for="(item,index) in data" :key="item.di"><slot :item="item" :index="index"></slot></tr>    </tbody></table>
</template><script>
export default {props:{data:{type:Array,required:true,}}
}
</script><style lang="less">.my-table {width: 100%;border-spacing: 0;img {width: 100px;height: 100px;object-fit: contain;vertical-align: middle;}th {background: #f5f5f5;border-bottom: 2px solid #069;}td {border-bottom: 1px dashed #ccc;}td,th {text-align: center;padding: 10px;transition: all 0.5s;&.red {color: red;}}.none {height: 100px;line-height: 100px;color: #999;}}</style>

MyTag.vue

<template><div class="my-tag"><input v-if="isEdit"v-focusref="inp"class="input"type="text"placeholder="输入标签":value="value"@blur="isEdit = false"@keyup.enter="handleEnter"/><div v-else @dblclick="handleClick" class="text"><!-- 茶具 -->{{ value }}</div></div></template><script>export default {props:{value:String},data(){return {isEdit:false,}},methods:{handleClick(){// 双击后切换到显示状态(输入框)this.isEdit = true// // // 通过ref找到元素,立刻获取焦点// // this.$refs.inp.focus()// // 异步更新,切换到显示状态后,dom并没有进行更新,立即获取焦点实际是获取不到的// // 等dom更新王再获取焦点// this.$nextTick(() => {//   this.$refs.inp.focus()// })// // 每次都要点focus进行获取焦点很麻烦,可以将这套指令封装为指令,在main.js中进行全局注册},handleEnter(e){if (e.target.value.trim() === '') return alert('标签不能为空')// 子传父,将回车时,输入框的内容提交给父组件更新// 由于父组件是v-model,所以触发事件需要触发input事件this.$emit('input',e.target.value)// 提交完成,关闭输入状态this.isEdit = false}}}</script><style lang="less" scoped>.my-tag {cursor: pointer;.input {appearance: none;outline: none;border: 1px solid #ccc;width: 100px;height: 40px;box-sizing: border-box;padding: 10px;color: #666;&::placeholder {color: #666;}}}</style>




补充:在输入框中的  :value = "value",是指将父组件通过v-model传过来的value值绑定给输入框自定义的属性 :value。后面e.target.value也就是获取元素对象属性value的值。

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

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

相关文章

Python 基础学习(一)

一.基础语法 注释 Python中单行注释以 # 开头&#xff0c;如下&#xff1a; #!/usr/bin/python3# 第一个注释 print ("Hello, Python!") # 第二个注释多行注释可以用多个 # 号&#xff0c;还有 ‘’’ 和 “”"&#xff1a; #!/usr/bin/python3# 第一个注释…

TIM输入捕获---STM

一、简介 IC输入捕获 输入捕获模式下&#xff0c;当通道输入引脚出现指定电平跳变时&#xff0c;当前CNT的值将被锁存在CCR中&#xff0c;可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数 每个高级定时器和通用定时器都拥有4个输入捕获通道 可配置为PWMI模…

【Android Studio】学习——网络连接

实验&#xff1a;Android网络连接 文章目录 实验&#xff1a;Android网络连接[toc]实验目标和实验内容&#xff1a;1、掌握Android联网的基本概念&#xff1b;2、能够使用URL connection实现网络连接&#xff1b;3、掌握第三方库的基本概念4、需实现的具体功能 实验结果功能说明…

ROS学习笔记二:ROS环境搭建

安装ubuntu安装ROS 参考赵虚左老师教程&#xff1a;ROS安装ROS 快速上手体验 -使用命令来实现 –创建工作空间&#xff1a; mkdir -p ros_learn_ws/src// ros_learn_ws为自定义空间 cd ros_learn_ws catkin_make –创建ROS功能包并添加依赖 cd src catkin_create_pkg demo_01 r…

5G中什么是ATG网络?

有人问Air to Ground Networks for NR是怎么回事&#xff1f;这个是R18 NR才引入的。 ATG很多部分和NTN类似中的内容类似。比较明显不同的是&#xff0c;NTN的RF内容有TS 38.101-5单独去讲&#xff0c;而ATG则会和地面网络共用某些band&#xff0c;ATG可以工作在N1/N3/N34/N39…

基础算法--双指针

两数之和 点击&#xff1a;题目链接 解法一&#xff1a;暴力解法 时间复杂度&#xff1a;O(N^2) 算法思路&#xff1a;两层for循环即可列出所有两个数字的组合&#xff0c;判断是否等于目标值 算法流程&#xff1a; 两层 for 循环&#xff1a; 外层 for 循环依次枚举第⼀个…

什么是Linux系统架构?

​ Linux系统架构是指Linux操作系统的整体结构和工作层次&#xff0c;它定义了系统组件如何交互、如何管理硬件资源&#xff0c;以及用户如何通过不同的层次与系统进行交互。Linux架构通常有两种划分方法&#xff1a;系统层次架构和功能层次架构&#xff0c;两者都可以很好地描…

spring6:4、原理-手写IoC

目录 4、原理-手写IoC4.1、回顾Java反射4.2、实现Spring的IoC 4、原理-手写IoC 我们都知道&#xff0c;Spring框架的IOC是基于Java反射机制实现的&#xff0c;下面我们先回顾一下java反射。 4.1、回顾Java反射 Java反射机制是在运行状态中&#xff0c;对于任意一个类&#x…

不是“我应该做什么”,而是“我想做什么”

1. 识别内心的渴望 首先&#xff0c;我们需要识别自己真正的愿望和激情所在。这可能需要一些时间和自我反思。问自己&#xff1a;在没有任何外界压力的情况下&#xff0c;我真正想做的是什么&#xff1f;是赚钱、生活、旅行、追星&#xff0c;还是其他什么&#xff1f;识别这些…

30天学会Go--第7天 GO语言 Redis 学习与实践

30天学会Go–第7天 GO语言 Redis 学习与实践 文章目录 30天学会Go--第7天 GO语言 Redis 学习与实践前言一、Redis 基础知识1.1 Redis 的核心特性1.2 Redis 常见使用场景 二、安装 Redis2.1 在 Linux 上安装2.2 在 Windows 上安装2.3 使用 Docker 安装 Redis 三、Redis 常用命令…

Vue项目开发 如何实现父组件与子组件数据间的双向绑定?

在 Vue.js 中&#xff0c;实现父组件与子组件数据之间的双向绑定&#xff0c;可以通过以下几种方式。下面我将介绍几种常见的方法&#xff0c;并解释它们的实现原理和适用场景。 1. 使用 v-model 实现双向绑定 v-model 是 Vue.js 中最常见的双向绑定方式&#xff0c;它可以使…

React第十七章(useRef)

useRef 当你在React中需要处理DOM元素或需要在组件渲染之间保持持久性数据时&#xff0c;便可以使用useRef。 import { useRef } from react; const refValue useRef(initialValue) refValue.current // 访问ref的值 类似于vue的ref,Vue的ref是.value&#xff0c;其次就是vu…

【C++】内存分布、new、delete、 operator new、operator delete

内存分布 在C语言和C中&#xff0c;程序内存被划分成六个部分&#xff1a; 内核空间、栈、内存映射段、堆、数据段、代码段 栈&#xff1a;又称堆栈&#xff0c;主要为非静态局部变量、函数参数、返回值等&#xff0c;栈的生长方向是向下生长的 内存映射段&#xff1a;高效的…

代码随想录算法训练营day37|动态规划part5

今天的几道题目都比较简单&#xff0c;思路也比较相似&#xff0c;都是利用完全背包。完全背包和01背包的不同点在于完全背包每个元素可以取多次&#xff0c;而01背包只能取1次&#xff0c;所以在dp一维数组遍历时&#xff0c;完全背包仍然要从前往后遍历&#xff0c;并且无论是…

混合云策略在安全领域受到青睐

Genetec 发布了《2025 年物理安全状况报告》&#xff0c;该报告根据超过 5,600 名该领域领导者&#xff08;其中包括 100 多名来自澳大利亚和新西兰的领导者&#xff09;的回应&#xff0c;揭示了物理安全运营的趋势。 报告发现&#xff0c;澳大利亚和新西兰的组织采用混合云策…

FastAPI解决跨域报错net::ERR_FAILED 200 (OK)

目录 一、跨域问题的本质 二、FastAPI中的CORS处理 1. 安装FastAPI和CORS中间件 2. 配置CORS中间件 3. 运行FastAPI应用 三、解决跨域报错的步骤 四、案例:解决Vue.js与FastAPI的跨域问题 1. Vue.js前端应用 2. FastAPI后端API 3. 配置CORS中间件 4. 运行和测试 五…

为什么 JavaScript 中的 `new` 运算符报错?

在 JavaScript 中&#xff0c;new 运算符通常用于创建一个新对象并调用构造函数来初始化对象。然而&#xff0c;new 运算符可能会引发一些错误&#xff0c;通常是由于以下原因导致的&#xff1a; 构造函数没有正确的定义&#xff1a; 如果使用 new 运算符调用的函数没有正确地定…

霍尔效应电流传感器

适用于大电流&#xff0c;低功耗的电流检测&#xff1a; TVS选型: RS232的隔离电路: 单片机采集200伏高压 如何做隔离电路&#xff1a; 采用线性光电耦合器HCNR200实现高压直流母线电压的精确采样。还是用电阻分压&#xff0c;只是在ADC检测阶段加上隔离芯片&#xff1a;

如何设置Java爬虫的异常处理?

在Java爬虫中设置异常处理是非常重要的&#xff0c;因为网络请求可能会遇到各种问题&#xff0c;如连接超时、服务器错误、网络中断等。通过合理的异常处理&#xff0c;可以确保爬虫的稳定性和健壮性。以下是如何在Java爬虫中设置异常处理的步骤和最佳实践&#xff1a; 1. 使用…

ceph /etc/ceph-csi-config/config.json: no such file or directory

环境 rook-ceph 部署的 ceph。 问题 kubectl describe pod dragonfly-redis-master-0Warning FailedMount 7m59s (x20 over 46m) kubelet MountVolume.MountDevice failed for volume "pvc-c63e159a-c940-4001-bf0d-e6141634cc55" : rpc error: cod…