Implementando Edição de Células e Estilização em Tabelas iView com a Função Render

Ao desenvolver interfaces complexas com o framework Vue.js utilizando a biblioteca iView (View UI), o componente de Tabela é frequentemente utilizado para exibir dados. Uma necessidade comum é transformar uma célula estática em um campo editável (input) dinamicamente. Isso é realizado através da função render, que permite manipular o Virtual DOM de forma programática.

Estrutura de uma Tabela Editável

Para criar o efeito de edição, utilizamos uma propriedade de controle dentro do objeto de dados (ex: editando). Quando o estado dessa propriedade muda, a função render alterna a exibição entre um elemento de texto e um componente de entrada.


<template>
  <div class="container-tabela">
    <Table border :columns="colunasConfig" :data="listaFuncionarios"></Table>
  </div>
</template>

<script>
export default {
  data() {
    return {
      colunasConfig: [
        {
          title: 'Nome do Colaborador',
          key: 'nome'
        },
        {
          title: 'Idade',
          key: 'idade',
          render: (h, params) => {
            // Verifica se a linha atual está em modo de edição
            if (params.row.editando) {
              return h('input', {
                domProps: {
                  value: params.row.idade
                },
                on: {
                  input: (event) => {
                    params.row.idade = event.target.value;
                  }
                },
                // Exemplo de aplicação de estilo inline no input
                style: {
                  width: '100%',
                  borderRadius: '4px',
                  border: '1px solid #dcdee2',
                  padding: '4px'
                }
              });
            } else {
              return h('div', params.row.idade);
            }
          }
        },
        {
          title: 'Ações',
          key: 'acao',
          render: (h, params) => {
            return h('Button', {
              props: {
                type: params.row.editando ? 'success' : 'primary',
                size: 'small'
              },
              on: {
                click: () => {
                  if (params.row.editando) {
                    this.confirmarEdicao(params.row);
                  } else {
                    this.ativarModoEdicao(params.row);
                  }
                }
              }
            }, params.row.editando ? 'Salvar' : 'Editar');
          }
        }
      ],
      listaFuncionarios: [
        { nome: 'Carlos Silva', idade: 30, editando: false },
        { nome: 'Ana Souza', idade: 25, editando: false }
      ]
    };
  },
  methods: {
    ativarModoEdicao(row) {
      this.$set(row, 'editando', true);
    },
    confirmarEdicao(row) {
      this.$set(row, 'editando', false);
      // Aqui pode ser inserida a lógica para persistir os dados no servidor
    }
  }
};
</script>

Customização de Estilos na Função Render

Diferente do template HTML padrão, na função render do iView, a estilização deve ser passada como um objeto dentro do nó de configuração do elemento. Existem duas abordagens principais para definir o visual dos elementos gerados:

1. Utilizando a Propriedade Style

A propriedade style recebe um objeto onde as chaves são os nomes das prporiedades CSS em formato camelCase. Esta abrodagem é ideal para estilos dinâmicos ou específicos que não se repetem em outros lugares da aplicação.


render: (h, params) => {
  return h('span', {
    style: {
      color: '#2d8cf0',
      fontSize: '14px',
      fontWeight: 'bold',
      cursor: 'pointer',
      marginRight: '8px'
    }
  }, 'Visualizar Detalhes');
}

2. Utilziando a Propriedade Class

Para manter o código mais limpo e reaproveitar classes CSS globais ou do componente, utiliza-se a chave class. Ela pode aceitar uma string, um array ou um objeto (para classes condicionais).


render: (h, params) => {
  return h('div', {
    class: {
      'texto-destaque': true,
      'ativo': params.row.status === 'ativo'
    }
  }, params.row.status);
}

Ao trabalhar com inputs dentro da tabela, a estilização correta garante que o layout não sofra quebras bruscas quando a célula alterna entre o modo de leitura e o modo de escrita, proporcionando uma experiência de usuário mais fluida.

Tags: iView view-ui Vue.js javascript frontend

Publicado em 8-30 03:13