vue 两个相同组件操作,相互影响,操作一个影响另一个(使用js原生dom操作导致document.getElementById(tableId).querySelectorAll(‘td‘))

解决办法就是 替换代码中的js原生操作,因为使用原生dom操作document.getElementById(tableId).querySelectorAll('td') 它不受vue管理也没有虚拟节点操作啥的,也实现不了组件的作用域隔离功能。具体修改改变代码如下(改完瞬间就好了,每个组件都变成独立的个体了):

 const rowList = tableIdR.value.querySelectorAll('tr');
   console.log('vue新方法 rowList ',rowList)

  // const rowList = document.getElementById(tableId).querySelectorAll('tr')
  // console.log('原方法 rowList ',rowList)

  <table
    border="1"
    ref="tableIdR" //我称之为 vue id
    :id="tableId" // 传统原生dom id
    align="center"
    cellpadding="10"
    cellspacing="0"
  >
  <tr  v-for="rindex of rowNum" :key="rindex" :id="rindex" :ref="rindex" style="height: 30px;" >
      <td
        :ref="getCellSeq(rindex,cindex)"
        :id="getCellSeq(rindex,cindex)"
        :oid="getObject(rindex,cindex).oid"
        :initRow="rindex"
        :initCol="cindex"
        :type = "getObject(rindex,cindex).type"
        :col="JSON.stringify(getObject(rindex,cindex))"
        :myData="col"
        @mousedown="handleMouseDown"
        @mouseup="handleMouseUp"
        @contextmenu="openContextMenu($event)"
        v-for="cindex of colNum" :key="cindex"
        :style="{width:widthp,height:heightp,backgroundColor:getObject(rindex,cindex).bcolor}"
        class="cell"
      >
        {{getCellSeq(rindex,cindex) }} {{getObject(rindex,cindex) }} rindex:{{rindex  }}cindex:{{ cindex }} 
      </td>
    </tr>

const tableId = 'tableIdR'
const tableIdR = ref(null);


const clearBorderStyles = (tableId) => {
   const rowList = tableIdR.value.querySelectorAll('tr');
   console.log('vue新方法 rowList ',rowList)

  // const rowList = document.getElementById(tableId).querySelectorAll('tr')
  // console.log('原方法 rowList ',rowList)





// 获取范围并且将改变边框颜色
const applyBorderStyles = (tableId, startRow, startCol, endRow, endCol) => {
  clearBorderStyles(tableId)
  const cellList = tableIdR.value.querySelectorAll('td');//新的通过vue管理的节点信息获取方式
 // const cellList = document.getElementById(tableId).querySelectorAll('td') 传统获取方式

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面给出一个简单的用户选择器组件示例: ```vue <template> <div> <h3>选择用户</h3> <ul> <li v-for="user in users" :key="user.id" @click="selectUser(user)"> {{ user.name }} </li> </ul> </div> </template> <script> export default { name: 'UserSelector', props: { users: { type: Array, required: true } }, methods: { selectUser(user) { this.$emit('user-selected', user) } } } </script> ``` 这个组件接受一个名为 `users` 的数组作为参数,然后在模板中展示出来,每一个用户条目都可以被点击选择。当用户被选择时,通过 `$emit` 方法向调用方发送一个 `user-selected` 事件,并带上被选择的用户对象。 接下来,我们可以在父组件使用这个组件,并监听它的 `user-selected` 事件来获取用户选择的结果: ```vue <template> <div> <h2>用户选择器演示</h2> <user-selector :users="users" @user-selected="onUserSelected" /> <div v-if="selectedUser"> 你选择了:{{ selectedUser.name }} </div> </div> </template> <script> import UserSelector from '@/components/UserSelector.vue' export default { name: 'UserSelectorDemo', components: { UserSelector }, data() { return { users: [ { id: 1, name: '张三' }, { id: 2, name: '李四' }, { id: 3, name: '王五' }, { id: 4, name: '赵六' } ], selectedUser: null } }, methods: { onUserSelected(user) { this.selectedUser = user } } } </script> ``` 我们将 `UserSelector` 组件放在父组件中,并传入一个 `users` 数组作为参数。当用户选择了一个用户时,我们监听到 `user-selected` 事件,并将结果保存在 `selectedUser` 变量中,然后在模板中展示出来。 这就是一个简单的用户选择器组件的实现方式。当然,这只是一个示例,实际项目中可能需要更多的功能和复杂性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值