Um modelo de visualização CRUD fornece hospedagem de dados, estados e operações como submit()
form.name
loading.table
, o que faz com que os desenvolvedores construam uma visualização CRUD mais rapidamente.
Cruda fornece APIs unificadas para diferentes UIFrameworks por adaptadores Cruda.
<!-- $crud.query (query data hosting) -->
< el-input v-model =" $crud.query.xxx " > </ el-input >
<!-- $crud.table.data (table data hosting) -->
< el-table v-model =" $crud.table.data " > </ el-table >
<!-- $crud.form (form data hosting) -->
< el-form :model =" $crud.form " > </ el-form >
<!-- $crud.table.data (tree data hosting) -->
< el-tree :model =" $crud.table.data " > </ el-tree >
$crud . submit ( formEl ) //submit form
$crud . reload ( ) //reload table
$crud . cancel ( ) //cancel form
<!-- loading.query will be set automatically when reload() is called -->
< button class =" ... " :loading =" $crud.loading.query " @click =" $crud.reload() " >
查询
</ button >
/* when you call the toQuery(), Cruda will
1. set loading.query to True
2. package query, pagination, order, ...
3. emit hooks
4. catch exceptions
5. ...
*/
$crud . toQuery ( )
$crud . toQuery ( ) //GET
$crud . toDelete ( ) //DELETE
$crud . doUpdate ( ) //PUT
Você pode definir padrões globais do Cruda se todas as cenas tiverem o mesmo comportamento em seu projeto.
//what properties does 'rs' have depends on the backend return value
CRUD . defaults [ CRUD . HOOK . AFTER_QUERY ] = function ( crud , rs ) {
crud . pagination . total = rs . data . total
crud . table . data = rs . data . records || [ ]
}
CRUD . defaults . pagination . pageSize = 10
CRUD . defaults . view . opQuery = true
CRUD . defaults . table . rowKey = 'id'
Você pode modificar o URL/método para se adaptar ao serviço de back-end
CRUD . RESTAPI = {
QUERY : { url : "" , method : "GET" } ,
QUERY_DETAILS : { url : "/{id}" , method : "GET" } , //(v1.20+)
ADD : { url : "" , method : "POST" } ,
UPDATE : { url : "" , method : "PUT" } ,
DELETE : { url : "" , method : "DELETE" } ,
EXPORT : { url : "/export" , method : "GET" } ,
IMPORT : { url : "/import" , method : "POST" } ,
SORT : { url : "/sort" , method : "PUT" } ,
COPY : { url : "/copy" , method : "POST" } ,
ADD_OR_UPDATE : { url : "/addorupdate" , method : "POST" } , //(v1.20+)
}
Ou defina API somente de instância durante a ativação
const $crud = useCrud ( {
url : '/api/single' ,
restApi : {
//支持对象格式或字符串格式(仅能设置url)
ADD : { url : '/add-batch' , method : 'POST' } ,
COPY : '/copy2'
}
} )
* Observe que a chave da API deve estar em maiúscula
CRUD.xApi(apiName, apiUrl, config)
é usado para estender CRUD RESTAPI personalizado. Abaixo está um exemplo
//1. Extends an API. After that it will
/**
* a. Attach a method 'toClone' to the CRUD instance
* b. Add 'BEFORE_CLONE' and 'AFTER_CLONE' to CRUD.HOOK
*/
CRUD . xApi ( 'clone' , '/clone' , { method : 'POST' } )
//2. Add listener
onHook ( this , CRUD . HOOK . AFTER_CLONE , ( crud , rs ) => {
console . log ( 'xApi-->' , rs . data )
} )
//3. Call toClone
this . $crud . toClone ( { x : 1 , y : 2 } ) ;
Podemos configurar autoResponse
para atualizar a visualização da tabela automaticamente, isso pode ajudá-lo a evitar a perda do estado da página se você reload()
a página após adicionar/atualizar/excluir/copiar o envio antes. Um caso típico é que você pode perder todas as hierarquias de TreeTable que você abriu antes ao reload()
. Abaixo está a configuração
//1. Set a response validator to check if the response is valid
$crud . autoResponse . validator = ( response : { status : number } ) => {
return response . status === 200
}
//2. For such an Add-Oper like add/copy/import/..., it must set a getter in order to obtain new records with primary key from backend
CRUD . defaults . autoResponse . getter = ( response : any ) => {
return [ response . data ]
}
//2. If primary keys are generated at frontend, you can either return submitRows
CRUD . defaults . autoResponse . getter = ( response : any , submitRows ?: any [ ] ) => {
return submitRows
}
//3. For TreeTable, you need set parentKeyField in order to find parentNode. Default 'pid'
CRUD . defaults . autoResponse . parentKeyField = 'pid'
//4. Set insert position with 'head/tail'. Default 'head'
CRUD . defaults . autoResponse . position = 'head'
//4. For TreeTable, you need set childrenKeyField in order to find childNodes. Default 'children'
CRUD . defaults . autoResponse . childrenKeyField = 'children'
Depois disso, a visualização da tabela será atualizada pelo CRUDA. Se você quiser atualizar manualmente, você pode chamar autoProcess()
no gancho abaixo
// Other hooks which can invode autoProcess please see the doc below
onHook ( CRUD . HOOK . AFTER_DELETE , ( crud , rs , rows , autoProcess ) => {
autoProcess ( )
} )
Podemos configurar pagination.frontend
para habilitar a paginação frontend
useCrud ( {
...
pagination : {
//enable
frontend : true ,
}
} )
//Set global cache hook(Optional)
CRUD . defaults [ CRUD . HOOK . BEFORE_CACHE ] = function ( crud , rs , cache ) {
//cache custom data
cache ( {
data : {
rows : rs . data . rows ,
total : rs . data . total
}
} )
}
CRUD . defaults [ CRUD . HOOK . AFTER_QUERY ] = function ( crud , rs , params , slice ) {
//filter cache data
const keyword = params . keyword
let list = filter ( defaultTo ( rs . data . rows , [ ] ) , ( item : any ) => {
return test ( item . email , keyword ) ||
test ( item . uname , keyword ) ||
test ( item . ip , keyword ) ||
test ( item . domain , keyword )
} )
crud . pagination . total = defaultTo ( list . length , 0 ) ;
//use slice() to slice list. If pagination.frontend is disabled, slice() will return the list directly
crud . table . data = slice ( list ) ;
}
Depois de habilitar pagination.frontend, o método toQuery/reload
não solicita mais o backend, use reset
Chave de exibição de componentes
- opQuery
- opAdicionar
- opUpdate
- opExcluir
- opExportar
- opImportar
- opSort
- opCopy
Alternar estado de carregamento
- consulta
- mesa
- del
- enviar
- forma
- exportar
- importar
- organizar
- cópia
Consultar contêiner de dados
Classificar contêiner de dados
Contêiner de dados de tabela
- dados
- seleção
- todas as colunas
- pedidos
- rowKey✅
Contêiner de paginação
- tamanho da página ✅
- página atual
- total
- front-end
Contêiner de dados de formulário
estado de forma. 0:Normal;1:Adicionar;2:Atualizar;3:Visualizar;4:AdicionarouAtualizar
parâmetros ativos brutos
mensagem de erro bruto {nome, mensagem, status}
editando o id do
table.row
chave crud em múltiplas instâncias
ativar/desativar edição de instantâneo
mapa instantâneo. A chave é
table.row[rowKey]
irá quebrar a validação após a primeira captura
atualizará a visualização da tabela automaticamente depois de adicionar/atualizar/excluir/copiar
crud.table.data
Será mesclado na solicitação GET
API de instância que irá recuperar o
8. RESTAPI
Habilite o cache de consulta e os dados de cache personalizados por meio do gancho
BEFORE_CACHE
ou use a resposta de back-end padrão como dados de cache. Esta propriedade será verdadeira sepagination.frontend
estiver habilitado.
✅ Indica que os padrões globais são suportados ⚡ Indica que a ativação na forma de objeto é suportada
(Quando
frontend
é falso) Consulta de instância. Envie a solicitação GET para o back-end。O argumento 'query' será mesclado com $crud.query
Instância del. Enviar solicitação DELETE para o back-end
Exportação de instância. Enviar solicitação GET para o back-end
Importação de instância. Use
fieldName
para especificar o nome do arquivo da solicitação do servidor. Envie a solicitação POST para o back-end
Defina
formStatus
como 'Adicionar'
Defina
formStatus
como 'Atualizar' e envie a solicitação GET (padrão) para o back-end
Defina
formStatus
como 'AddOrUpdate' e envie a solicitação GET (padrão) para o back-end
Defina
formStatus
como 'View' e envie a solicitação GET (padrão) para o back-end
Classificação de instância. Enviar solicitação PUT (padrão) para o back-end
Cópia da instância. Enviar solicitação POST (padrão) para o back-end
Defina
formStatus
como 'Normal'
Passe argumentos para
BEFORE_SUBMIT
O mesmo que
submit()
mas não verificaformStatus
O mesmo que
submit()
mas não verificaformStatus
O mesmo que
submit()
mas não verificaformStatus
*Depende dos adaptadores . Validará um ou mais Formulários ou CustomComponent (que possui o método valid()) e depois chamará
submit()
Redefinir a paginação e chamar toQuery()
Retornar restUrl da instância
Definir parâmetros de URL
Retornar dados de linha
Geralmente usado em eventos de seleção de linha, como
selection-change
emelement-ui
Geralmente usado em eventos de classificação de tabela como
sort-change
emelement-ui
, ele chamarátoQuery()
automaticamente
Retorne o contexto do crud
Limpe os dados do cache e chame reload()
Emita antes da consulta. Pode modificar os parâmetros antes do envio da solicitação. Cancelável, se for cancelado o
AFTER_QUERY
não emitirá
Emita após consulta. Pode definir dados da tabela por 'rs'. Se
pagination.frontend
estiver habilitado, params e slice() podem ser usados para filtrar e fatiar dados de cache
Emita antes de excluir. Cancelável, se for cancelado o
AFTER_DELETE
não emitirá
Emitir após excluir. Use
autoProcess()
para atualizar a visualização da tabela
Emita antes de adicionar. Pode limpar os dados do formulário ou gerar um UUID. Cancelável, se for cancelado o
formStatus
não será alterado. ...argumentos detoAdd()
Emita após add e antes de
AFTER_SUBMIT
. UseautoProcess()
para atualizar a visualização da tabela
Emita antes da atualização. Cancelável, se for cancelado o
formStatus
não será alterado. Useskip()
para interromper a consulta detalhada eAFTER_DETAILS
não emitirá
Emitir após atualização e antes de
AFTER_SUBMIT
. UseautoProcess()
para atualizar a visualização da tabela
Emita antes de adicionar/atualizar. Cancelável, se for cancelado o
formStatus
não será alterado. UsedoView()
para consultar detalhes
Emita após adicionar/atualizar e antes de
AFTER_SUBMIT
. UseautoProcess()
para atualizar a visualização da tabela
Emita antes de visualizar. Cancelável, se for cancelado o
formStatus
não será alterado. Useskip()
para interromper a consulta detalhada eAFTER_DETAILS
não emitirá
Emite após
toUpdate/toView
e não é ignorado porskip()
Emitir após
toUpdate
eAFTER_DETAILS
Emitir depois de
toView
eAFTER_DETAILS
Emita antes do envio do formulário. Cancelável, se for cancelado o
AFTER_SUBMIT
não emitirá. UsesetForm(formObject)
para definir os dados do formulário a serem enviados
Emitir após o envio do formulário. Pode recarregar a página, envie aviso aqui. Use
autoProcess()
para atualizar a visualização da tabela
Emitir antes de exportar. Cancelável, se for cancelado o
AFTER_EXPORT
não emitirá
Emitir após conclusão da exportação
Emita antes de importar. Pode modificar os parâmetros antes do envio da solicitação. Cancelável, se for cancelado o
AFTER_IMPORT
não emitirá
Emitir após conclusão da importação
Emita antes de classificar. Cancelável, se for cancelado o
AFTER_SORT
não emitirá
Emitir após a classificação ser concluída
Emita antes de copiar. Cancelável, se for cancelado o
AFTER_COPY
não emitirá
Emita após a conclusão da cópia. Use
autoProcess()
para atualizar a visualização da tabela
Emitir em caso de erro
Emitir após cancelar() ser chamado
Emitir após submitForm() ser chamado
Emita antes de recuperar o snapshot
Emita após a consulta e
cache
serem ativados. Usecache(data)
para personalizar os dados do cache
Deve especificar 'crudName' quando várias instâncias forem detectadas
Rx 【Componente personalizado】
validação de formulário Xxx
Rx 【verificar regras de validação】
Não é possível encontrar [solicitação] nas opções de instalação
Rx 【Instalar】
table.rowKey é um valor em branco 'Xxx', pode causar um erro - toDelete/Update/View()
Rx 【definir rowKey como um valor não vazio】