手写简易v-bind,v-show,v-if

手写简易v-bind

<template>
  <div>
    <input type="text" v-my-bind:value="num" />
    <button @click="num++">更新num</button>
  </div>
</template>
<script>
export default {
  data() {
    return {
    	num: 1,
    };
  },
  directives: {
    "my-bind": {
      bind(element, binding, vnode) {
        // 设置一个属性
        element.setAttribute(binding.arg, binding.value);
      },
      update(element, binding, vnode) {
        element.setAttribute(binding.arg, binding.value);
      },
    },
},
};
</script>

手写简易v-show

<template>
  <div>
    <button v-my-show="isShow">我显示了</button>
    <button @click="isShow = !isShow">更新 isShow</button>
  </div>
</template>

<script>
function showOperation(element, binding, vnode) {
  if (binding.value) {
    // 显示元素
    element.style.display = "block";
  } else {
    // 隐藏元素
    element.style.display = "none";
  }
}
export default {
  data() {
    return {
      isShow: true,
    };
  },
  directives: {
    "my-show": {
      inserted: showOperation,
      update: showOperation,
    },
  },
};
</script>

手写简易v-if

<template>
  <div>
    <h1 v-my-if="isIf">我存在了</h1>
    <button @click="isIf = !isIf">更新 isIf</button>
  </div>
</template>

<script>
let cloneNode = null; //未来直接还原
let cloneNodeStr = null; //未来直接还原
let parent = null;
export default {
  data() {
    return {
      isIf: true,
    };
  },
  directives: {
    "my-if": {
      inserted(element, binding) {
        parent = element.parentNode;
        // cloneNode = element.cloneNode(); //保存自身
        cloneNodeStr = element.innerHTML; //保存自身
      },
      update(element, binding) {
        // 如果binding.value => true 插入元素
        // 如果binding.value => false  删除元素,留个<!-- -->
        if (binding.value) { //加入没有实现
          console.log("if", "parent.innerHTML", parent.innerHTML);
          parent.innerHTML = parent.innerHTML.replace( "<!-- -->", cloneNodeStr);
        } else {
          // replace 做替换
          parent.innerHTML = parent.innerHTML.replace(
            element.innerHTML,
            "<!-- -->"
          );
        }
      },
    },
  },
};
</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以为您提供一个简单的手写 el-tree 组件的示例。 首先,你需要定义一个 Vue 组件,命名为 `ElTree`。在组件中,你需要定义一个 template,其中包含树的节点。每个节点应该包含一个展开/折叠按钮、一个节点图标和节点的标签文本。你可以使用 v-for 指令来循环渲染每个节点。 代码示例如下: ```html <template> <ul class="el-tree"> <li v-for="node in nodes" :key="node.id"> <span class="el-tree-node__expand" @click="toggleNode(node)"> {{ node.expanded ? '-' : '+' }} </span> <span class="el-tree-node__icon">{{ node.icon }}</span> <span class="el-tree-node__label">{{ node.label }}</span> <ul v-if="node.expanded"> <el-tree :nodes="node.children"></el-tree> </ul> </li> </ul> </template> ``` 在组件的 JavaScript 部分,你需要接收一个名为 nodes 的 prop,该 prop 包含了树的节点数据。你需要在组件的 data 中定义一个名为 nodes 的属性,用于存储节点数据。在组件的 methods 中,你需要定义一个名为 toggleNode 的方法,用于展开/折叠节点。 代码示例如下: ```js <template> <ul class="el-tree"> <li v-for="node in nodes" :key="node.id"> <span class="el-tree-node__expand" @click="toggleNode(node)"> {{ node.expanded ? '-' : '+' }} </span> <span class="el-tree-node__icon">{{ node.icon }}</span> <span class="el-tree-node__label">{{ node.label }}</span> <ul v-if="node.expanded"> <el-tree :nodes="node.children"></el-tree> </ul> </li> </ul> </template> <script> export default { name: 'ElTree', props: { nodes: { type: Array, default: () => [] } }, data() { return { nodes: this.nodes } }, methods: { toggleNode(node) { node.expanded = !node.expanded } } } </script> ``` 这是一个简单的手写 el-tree 组件示例。你可以按照自己的需求进行修改和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

圥忈&&丅佽&&扗虖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值